1

我试图以各种方式处理这个循环,但我遇到的任何网站都没有帮助我解决我的问题。我对 R 比较陌生,可以在我的代码出错的地方使用一些指导。我正在尝试运行 for 循环以重复此序列 1000 次:创建两组随机数字“lakea”和“lakeb”,在两个湖上运行 t 检验,并存储该 t 的结果 p 值- 在空容器中测试(显着或不显着)(结果)。我觉得我很接近,但由于某种原因无法重复该过程。

result<-vector("list",1000)   #empty container to fill
for(i in 1:1000){
lakea<-rnorm(30,100,15)
lakeb<-rnorm(30,110,15)
    pval<-t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
    if(pval[i] <= 0.05) result[[i]]<-"stat sig" else   #if statement to name output
    result[[i]]<-"not sig"
}
result

循环产生 1 个实际结果和我想要的结果(“stat sig”或“not sig”),然后是容器内的 999 个 NULL 对象。

我还尝试将容器的代码更改为:

result<-vector("character",length(1000))
for(i in length(result)){
...

这给出了类似的结果,但在比第一个代码更少的行中创建了一个长向量(仍然只有第一个具有预期输出的对象)。我还尝试将容器代码更改为:

result<-c(NULL,length(1000))
for(i in result){
...

这给了我“stat sig”或“not sig”的第一个输出,但没有别的。在此先感谢您的帮助!

4

2 回答 2

4

您可以使用为这种重采样构建的循环构造将您的问题浓缩为一行,并ifelse用于结果的条件评估:

replicate( 1000 , ifelse( t.test( rnorm(30,100,15) ,  rnorm(30,100,15 ) )$p.value <= 0.05 , "stat.sig" , "not.sig" ) )
于 2013-08-06T14:14:11.027 回答
2

这是一些更简单的语法,可以避免初始化result向量:

myfun <- function(){
    lakea<-rnorm(30,100,15)
    lakeb<-rnorm(30,110,15)
    # OP's original code:
     #pval <- t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
     #if(pval <= 0.05)
     #    result <-"stat sig" else   #if statement to name output
     #result <- "not sig"
    # simplified version:
    result <- ifelse(pval <= 0.05, "sig", "not sig")
}
result <- replicate(1000,myfun())
于 2013-08-06T14:14:23.963 回答