java实现t检验

场景

用于两个总体均值之间的比较。

maven依赖

	<!-- https://mvnrepository.com/artifact/net.sf.jsci/jsci -->
		<dependency>
			<groupId>net.sf.jsci</groupId>
			<artifactId>jsci</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-math3 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-math3</artifactId>
			<version>3.6.1</version>
		</dependency>

	</dependencies>

用法

public class TtestDemo {

	/**
	 * two-sided test
	 * @author miaoyibo
	 * @param args
	 */
	public static void main(String[] args) {
		double[] x= {300,280,344,385,372,360,288,321,376,290,301,283};
		double[] y= {274,220,308,336,198,300,315,258,318,310,332,263};
		Ttest t=new Ttest(x, y);
		System.out.println(t.getPValue());

	}

}

实现代码

package com.math.statistics;
import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;

import JSci.maths.statistics.TDistribution;
/***
 * @author miaoyibo
 *
 */
public class Ttest {
	
	private double[] x;
	
	private double[] y;
	StandardDeviation standardDeviation =new StandardDeviation();
	
	public Ttest(double[] x, double[] y) {
		super();
		this.x = x;
		this.y = y;
	}
	public int getXSize() {
		return x==null?0:x.length;
	}
	public int getYSize() {
		return y==null?0:y.length;
	}
	public double getXMean() {
		int n=x.length;
		double sum=0;
		for (double d : x) {
			sum=sum+d;
		}
		return sum/n;
	}
	public double getYMean() {
		int n=y.length;
		double sum=0;
		for (double d : y) {
			sum=sum+d;
		}
		return sum/n;
	}
	public double getStandard(double[] x) {
		return standardDeviation.evaluate(x);
	}
	public double calculateTvalue() {
		double a=getXMean()-getYMean();
		double q1=getStandard(x);
		double q2=getStandard(y);
		double s1=q1*q1;
		double s2=q2*q2;
		double b=Math.sqrt(s1/x.length+s2/y.length);
		return a/b;
	}
	public int getDegreesOfFreedom() {
		double q1=getStandard(x);
		double q2=getStandard(y);
		double s1=q1*q1;
		double s2=q2*q2;
		double a=(s1/x.length+s2/y.length)*(s1/x.length+s2/y.length);
		double b=((s1/x.length)*(s1/x.length))/(x.length-1)+((s2/y.length)*(s2/y.length))/(y.length-1);
		Double free=a/b;
		return free.intValue();
	}
	public double getPValue() {
		int free=getDegreesOfFreedom();
		double t=calculateTvalue();
		TDistribution td=new TDistribution(free);
		double cumulative = td.cumulative(t);
		double p;
		if(t>0) {
			p=(1-cumulative)*2;
		}else {
			p=cumulative*2;
		}
		return p;
	}
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值