使用numpy计算tvalue

时间:2018-05-10 10:13:23

标签: python numpy scipy statistics

作为练习的一部分,我需要通过使用numpy生成tvalue并与scipy的输出进行比较来检查给定样本的真实均值是否为1.75。

代码:

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
np.random.seed(seed=42) # make example reproducible
n = 100
x = np.random.normal(loc=1.78, scale=.1, size=n) # the sample is here
tval, pval = stats.ttest_1samp(x, 1.75)

var_x = x.var(ddof=1)
std_x = np.sqrt(var_x)
tval1 = (x.mean() - 1.75)/(std_x*np.sqrt(n))
print("Scipy: ",tval,"\nNumpy: ",tval1)

Scipy的输出是2.1598800019529265, 而来自numpy的输出是0.021598800019529265

我猜我使用的逻辑不正确,请建议。

1 个答案:

答案 0 :(得分:0)

你在分母中犯了一个错误。它应该是

tval1 = (x.mean() - 1.75)/(std_x / np.sqrt(n))  # (std_x divided by root n)

这就是为什么你会发现Scipynumpy输出之间存在100差异((1/10)/ 10 = 1/100)的原因。

以下是Wiki of Student's t-test

使用其他样本量的示例:

np.random.seed(seed=42)
n = 369
x = np.random.normal(loc=1.78, scale=.1, size=n) # the sample is here
tval, pval = stats.ttest_1samp(x, 1.75)

var_x = x.var(ddof=1)
std_x = np.sqrt(var_x)
tval1 = (x.mean() - 1.75)/(std_x / np.sqrt(n))
print("Scipy: ",tval,"\nNumpy: ",tval1)

# Output:
# Scipy:  6.306500305262841
# Numpy:  6.306500305262841