1、demo
package com.math.demo;
import java.math.BigDecimal;
import com.math.regression.RegressionEquation;
import com.math.regression.RegressionModel;
/***
*
* @author miaoyibo
*
*/
public class RegressionDemo {
public static void main(String[] args) {
double[] dependentValues= {58,105,88,118,117,137,157,169,149,202};
double[] independentValues= {2,6,8,8,12,16,20,20,22,26};
RegressionEquation re=new RegressionEquation(dependentValues, independentValues);
RegressionModel regressionModel = re.getRegressionModel();
System.out.println("b0=="+regressionModel.getB0());
System.out.println("b1=="+regressionModel.getB1());
System.out.println("coefficient of determination=="+regressionModel.getR());
System.out.println("T test=="+new BigDecimal(+regressionModel.getP()));
}
}
2、实现
package com.math.regression;
import org.apache.commons.math3.stat.descriptive.moment.Mean;
import JSci.maths.statistics.TDistribution;
/***
* least squares method
* @author miaoyibo
*
*/
public class RegressionEquation {
//因变量y
private double[] dependentValues;
//自变量x
private double[] independentValues;
Mean meanUtil = new Mean();
double xmean;
double ymean;
double sse;
double sst;
public RegressionEquation(double[] dependentValues, double[] independentValues) {
this.dependentValues = dependentValues;
this.independentValues = independentValues;
xmean=meanUtil.evaluate(independentValues);
ymean=meanUtil.evaluate(dependentValues);
}
public RegressionModel getRegressionModel() {
RegressionModel model=new RegressionModel();
double[] regression = calRegression();
double sse=0;
double sst=0;
for(int i=0;i<dependentValues.length;i++) {
double yi=independentValues[i]*regression[1]+regression[0];
double y=dependentValues[i];
sse=sse+(y-yi)*(y-yi);
sst=sst+(y-ymean)*(y-ymean);
}
double coefficientOfDetermination = (sst-sse)/sst;
model.setB0(regression[0]);
model.setB1(regression[1]);
model.setR(coefficientOfDetermination);
Ttest(sse,model);
return model;
}
/***
* 计算回归方程
* @return
*/
public double[] calRegression() {
if(dependentValues.length!=independentValues.length) {
return null;
}
double numerator=0d;
double denominator=0d;
for(int i=0;i<dependentValues.length;i++) {
double x=independentValues[i];
double y=dependentValues[i];
numerator=numerator+(x-xmean)*(y-ymean);
denominator=denominator+(x-xmean)*(x-xmean);
}
double b1=numerator/denominator;
double b0=ymean-b1*xmean;
double[] model= {b0,b1};
return model;
}
/***
* 利用T检验检验两个变量之间是否存在一个显著的回归关系。
* @return
*/
private void Ttest(double sse,RegressionModel model) {
//计算标准误差
//自由度为2,因为涉及两个变量。
double s=Math.sqrt(sse/(dependentValues.length-2));
//计算标准差
double xx=0;
for(int i=0;i<independentValues.length;i++) {
double xi=independentValues[i];
xx=xx+((xi-xmean)*(xi-xmean));
}
double sb=s/Math.sqrt(xx);
//计算t值
double t=model.getB1()/sb;
//计算p值
TDistribution td=new TDistribution(dependentValues.length-2);
double cumulative = td.cumulative(t);
double p;
if(t>0) {
p=(1-cumulative)*2;
}else {
p=cumulative*2;
}
model.setP(p);
}
}
package com.math.regression;
public class RegressionModel {
//y轴截距
private double b0;
//斜率
private double b1;
//判定系数
private double r;
private double p;
public double getB0() {
return b0;
}
public void setB0(double b0) {
this.b0 = b0;
}
public double getB1() {
return b1;
}
public void setB1(double b1) {
this.b1 = b1;
}
public double getR() {
return r;
}
public void setR(double r) {
this.r = r;
}
public double getP() {
return p;
}
public void setP(double p) {
this.p = p;
}
}