java实现简单线性回归—显著性检验

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;
	}
	
	

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值