pandas 用统计学中的一个样本进行Scipy t检验?

ecbunoof  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(65)

是否可以使用scipy.stats.ttest_1samp进行t检验,其中输入是统计量而不是数组?例如,对于均值差异,您有两个选项:ttest_ind()和ttest_ind_from_stats()。

import numpy as np
import scipy.stats as stats
from scipy.stats import norm

mean1=35.6
std1=11.3
nobs1=84
mean2=44.7
std2=8.9
nobs2=84
print(stats.ttest_ind_from_stats(mean1, std1, nobs1, mean2, std2, nobs2, equal_var=False))
# alternatively, you can pass 2 arrays
print(stats.ttest_ind(
stats.norm.rvs(loc=mean1, scale=std1, size=84), 
stats.norm.rvs(loc=mean2, scale=std2, size=84),
equal_var=False)
 )

字符串
是否有一个等效的函数与单样本t检验?谢谢你的帮助。

brccelvz

brccelvz1#

TL;DR

对于单样本测试没有这样的函数,但是你可以使用双样本函数。简而言之,要执行单样本 t-测试,请执行以下操作:

sp.stats.ttest_ind_from_stats(mean1=sample_mean, 
                              std1=sample_std, 
                              nobs1=n_samples, 
                              mean2=population_mean, 
                              std2=0, 
                              nobs2=2, 
                              equal_var=False)

字符串
请注意,结果完全独立于nobs2(因为在单样本测试中没有 n2)。只需确保传入>1的值以避免被零除。

如何使用?

查看有关different types of t-test的维基百科页面。
单样本t检验使用统计量
x1c 0d1x的数据
n - 1 个自由度
ttest_ind_from_stats函数可以执行Welch t检验(不等样本大小,不等方差),其定义为



自由度:

我们可以将Welch t检验的定义转化为单样本 t 检验,如果我们将mean2设为总体均值,std2设为0,则 t 统计量的方程是相同的,自由度减少到 n - 1

dgenwo3n

dgenwo3n2#

这里提供的方法非常好,但是提供的p值可能需要很少的调整,因为人口规模为1或2可能会扭曲p值。我尝试用更大的人口规模重写函数如下:

def tttest_1samp_from_stats(sample_mean, sample_std, sample_size, popmean):
    POPSIZE = 100000000000000000
    return stats.ttest_ind_from_stats(mean1=sample_mean,
                                      std1=sample_std,
                                      nobs1=sample_size,
                                      mean2=popmean,
                                      std2=0.0,
                                      nobs2=POPSIZE,
                                      equal_var=False)

字符串
这对我的案子很有用
示例如下:

data = [15.8,16.1,16.3,16.25,16.6, 16.22,16.2,16.1,16.15,16.08,16.32,
16.5, 16.6, 16.7, 16.3]

print(f"sample size: {len(data)}, sample mean: {sum(data)/len(data)}, standard deviation: {np.std(data, ddof=1)}")
#perform one sample t-test result = stats.ttest_1samp(a=data, popmean=16.1) print(result) 

#Result:
sample size: 15, sample mean: 16.281333333333333, standard deviation:
0.23829353647090304 
TtestResult(statistic=2.9472095236541365, pvalue=0.010604297674644585, df=14)

#########

mean = np.mean(data)
sd = np.std(data, ddof=1)
print(sd)
n = len(data)
print(tttest_1samp_from_stats(mean, sd, n, 16.1))

#Result:
Ttest_indResult(statistic=2.9472095236541365, pvalue=0.010604297674644585)

相关问题