v2 / examples / linear_regression / simple_linear_regression.v
55 lines · 52 sloc · 1.95 KB · c51d30bf5309653c6b573ec815268e69a78ea8cc
Raw
1import math
2
3struct LinearResult {
4 r2 f64
5 intercept f64
6 slope f64
7 dependent_variable_means f64
8 independent_variable_means f64
9}
10
11fn linearrelationship(independent_variable []int, dependent_variable []int) LinearResult {
12 // Objective :
13 // Find what is the linear relationship between two dataset X and Y?
14 // x := independent variable
15 // y := dependent variable
16 mut sum_r2_x := 0
17 mut sum_r2_y := 0
18 mut sum_xy := 0
19 mut sum_x := 0
20 mut sum_y := 0
21 for i in independent_variable {
22 sum_x += i
23 sum_r2_x += i * i
24 }
25 for yi in dependent_variable {
26 sum_y += yi
27 sum_r2_y += yi * yi
28 }
29 x_means := sum_x / independent_variable.len
30 y_means := sum_y / dependent_variable.len
31 for index, x_value in independent_variable {
32 sum_xy += x_value * dependent_variable[index]
33 }
34 // /Slope = (∑y)(∑x²) - (∑x)(∑xy) / n(∑x²) - (∑x)²
35 slope_value := f64((sum_y * sum_r2_x) - (sum_x * sum_xy)) / f64((sum_r2_x * independent_variable.len) - (sum_x * sum_x))
36 // /Intercept = n(∑xy) - (∑x)(∑y) / n(∑x²) - (∑x)²
37 intercept_value := f64((independent_variable.len * sum_xy) - (sum_x * sum_y)) / f64((independent_variable.len * sum_r2_x) - (sum_x * sum_x))
38 // Regression equation = Intercept + Slope x
39 // R2 = n(∑xy) - (∑x)(∑y) / sqrt([n(∑x²)-(∑x)²][n(∑y²)-(∑y)²]
40 r2_value := f64((independent_variable.len * sum_xy) - (sum_x * sum_y)) / math.sqrt(f64((sum_r2_x * independent_variable.len) - (sum_x * sum_x)) * f64((sum_r2_y * dependent_variable.len) - (sum_y * sum_y)))
41 return LinearResult{
42 r2: r2_value
43 intercept: intercept_value
44 slope: slope_value
45 independent_variable_means: x_means
46 dependent_variable_means: y_means
47 }
48}
49
50fn main() {
51 independent_variable := [4, 5, 6, 7, 10]
52 dependent_variable := [3, 8, 20, 30, 12]
53 result := linearrelationship(independent_variable, dependent_variable)
54 println(result)
55}
56