如何迭代计算 t 检验的 p 值
Posted
技术标签:
【中文标题】如何迭代计算 t 检验的 p 值【英文标题】:How to iteratively compute p-values for t-test 【发布时间】:2019-09-09 05:30:59 【问题描述】:a) 从 X ~ N (μX= 25, σX = 4) 生成 50 个值,从 Y ~ N (μY= 25, σY = 4) 生成 50 个值。使用 t 检验来检验均值是否相等。
c) 重复 (a) 部分 2500 次,并为 2500 次测试中的每一次保留 p 值。每次重复都应该为 x 生成一个新样本,为 y 生成一个新样本。不要打印 p 值。不要使用循环。
我解决了一个rnorm
样本的 A 部分,但我不知道从哪里开始获取 2500 个不同的 x 随机样本和 2500 个不同的 y 随机样本以获得 2500 个不同的 p 值。
我也不知道如何确保编写我的代码,以便我的教授得到与我相同的答案。我尝试设置种子,但这只会使 p 值使用我上面的代码都相同。
# Part A
set.seed(1081)
x = rnorm(50,25,4)
y = rnorm(50,25,4)
t.test(x,y)
#Part B
#The p-value is 0.3752.
#We do not reject the null hypothesis.
#Part C
x1 = sample(x, 2500, replace = T)
y1 = sample(y, 2500, replace = T)
pval = sample(t.test(x1,y1)$p.value, 2500, replace = T)
【问题讨论】:
【参考方案1】:还有一种可能是:
set.seed(1081)
n <- 50
times <- 2500
x <- data.frame(matrix(rnorm(n*times, mean=25, sd=4), nrow=n))
y <- data.frame(matrix(rnorm(n*times, mean=25, sd=4), nrow=n))
pvals <- mapply(FUN = function(x,y) t.test(x,y)$p.value, x, y)
mean(pvals < .05) # should be ~= .05
Loop simultaneously over two lists in R (jogo的评论)
但如果我们从字面上理解“每次重复都应该生成新样本”,@Cettt 的答案可能就是我们想要的。
【讨论】:
【参考方案2】:另一种可能是使用replicate
:
请注意,您必须在函数之外设置随机种子。
myfun <- function()
x <- rnorm(50, 25, 4)
y <- rnorm(50, 25, 4)
return(t.test(x, y)$p.value)
set.seed(1)
p_vals <- replicate(2500, myfun())
【讨论】:
【参考方案3】:另一种方法是这样的:
library(MASS) #load MASS library
s <- 4*diag(2500) #create the variance matrix for the simulation
set.seed(123) # seed to replicate results
x <- mvrnorm( 50, m= rep(25,times=2500), Sigma=s) #draw 50 values, 25000 times
y <- mvrnorm( 50, m = rep(25, times=2500), Sigma=s) #draw 50 values, 2500 times
diff <- x - y
test <- apply(diff,2,t.test) #do the t.tests
names(test) #some of the results you can print
如果您对代码有任何疑问,可以问我。
【讨论】:
为什么要取 x 和 y 的差值? 当您想在两个样本之间执行 t 检验(因此 x,y)时,测试它们的差异是否为零是相同的。因此,为了进行一次 t 检验,您可以创建一个新样本 z ( z= x-y) 并进行测试,t.test(z, mu=0)。使用两个样本测试 t.test(x,y),您将得到几乎相同的结果。以上是关于如何迭代计算 t 检验的 p 值的主要内容,如果未能解决你的问题,请参考以下文章