-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLinearRegression.m
70 lines (57 loc) · 2.32 KB
/
LinearRegression.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
// LinearRegressionData.m
// LinearRegression
//
// Created by Phillip Porch on 1/22/12.
// Copyright (c) 2012 ThePorchDotCom. All rights reserved.
//
// This linear regression calculator object expects to be passed an
// Array of x,y values that are doubles
#import "LinearRegression.h"
#import "DataItem.h"
@interface LinearRegression()
@property (nonatomic) double slope;
@property (nonatomic) double intercept;
@property (nonatomic) double correlation;
@property (nonatomic) double sumY;
@property (nonatomic) double sumX;
@property (nonatomic) double sumXY;
@property (nonatomic) double sumX2;
@property (nonatomic) double sumY2;
@end
@implementation LinearRegression
@synthesize slope = _slope;
@synthesize intercept = _intercept;
@synthesize correlation = _correlation;
@synthesize sumY = _sumY;
@synthesize sumX = _sumX;
@synthesize sumXY = _sumXY;
@synthesize sumX2 = _sumX2;
@synthesize sumY2 = _sumY2;
- (RegressionResult *)calculateRegression:(NSArray *)theArray {
// theArray should be an array of DataItem objects that each contain
// two double numbers ( the x and y value of the data)
// if you created the original array as a NSMutableArray so you could add
// objects, you will probably want to make a copy like
// NSArray *theArray = [mutableArray copy]; and then call the linearRegression object like
// [instanceOfLinearRegressionData calculateRegression:theArray];
RegressionResult *result = [[RegressionResult alloc] init];
NSInteger theNumber = theArray.count;
self.sumY = 0.0;
self.sumX = 0.0;
self.sumXY = 0.0;
self.sumX2 = 0.0;
self.sumY2 = 0.0;
for (DataItem *data in theArray) {
_sumX = _sumX + data.xValue;
self.sumY = _sumY + data.yValue;
self.sumXY = _sumXY + (data.xValue * data.yValue);
self.sumX2 = _sumX2 + (data.xValue * data.xValue);
self.sumY2 = _sumY2 + (data.yValue * data.yValue);
}
result.slope = ((theNumber * self.sumXY) - self.sumX * self.sumY) / ((theNumber * self.sumX2) - (self.sumX * self.sumX));
result.intercept = ((self.sumY - (self.slope * self.sumX))/theNumber);
result.correlation = fabs((theNumber * self.sumXY) - (self.sumX * self.sumY)) / (sqrt((theNumber * self.sumX2 - self.sumX * self.sumX) * (theNumber * self.sumY2 - (self.sumY * self.sumY))));
return result;
}
@end