【问题标题】:Simulating t-test p-values using a for loop使用 for 循环模拟 t 检验 p 值
【发布时间】:2011-02-21 08:05:00
【问题描述】:

对于这个项目,我需要使用 R 脚本来模拟 t 检验的有效性。我必须使用一个for循环才会执行以下2000次:

循环看起来像这样吗

i <- 1
for (i <= 2001) { 
    x <-rf(5,df1=5,df2=10)
    b <- df2
    p.value <-t.test(x,mu=(b/(b-2))$p.value
    i <- i+1
}

【问题讨论】:

  • 这是一道显而易见的家庭作业题。
  • @Colin 是的,但就他们而言,这还不错。 meta.stackexchange.com/questions/10811/…
  • 好吧,即使这是家庭作业,至少他尝试过并包含一段代码... +1 尝试
  • @nico 如果您仔细观察,您会发现他没有查看for 的帮助页面(语义错误)并且他没有执行此代码。所以-1表示假装做某事。他使用 StackOverflow 作为 R 代码解释器。有人应该回答Error: unexpected '&lt;=' in "for (i &lt;="

标签: r loops statistics


【解决方案1】:

按照您编写的方式,这将是一个“while”循环。

R 中的 For 循环具有以下语法:

for (i in 1:2000) {
    df1 <- 5
    df2 <- 10
    x <-rf(5, df1=df1, df2=df2)
    b <- df2
    p.value <- t.test(x, mu=(b/(b-2)))$p.value
}

此外,使用“应用”构造可能更有效,例如使用复制,并将 df 作为函数参数包含在内:

get.p.value <- function(df1, df2) {
        x <- rf(5, df1=df1, df2=df2)
        p.value <- t.test(x, mu=(df2/(df2-2)))$p.value
    }
replicate (2000, get.p.value(df1 = 5, df2 = 10))

这并不总是正确的,但它简化了 p.values 的恢复。

【讨论】:

  • 在您的第一个解决方案中,您可以将分配排除在循环之外。 id 不需要 2000 次分配相同的值。所以它可以像df1&lt;-5;df2&lt;-b&lt;-10;for(i in 1:2000) p.value &lt;- t.test(rf(5, df1=df1, df2=df2), mu=(b/(b-2)))$p.value
  • 对于for 版本(也在我的修改中)结果不保存。因此,在循环之后,您将保持一个值。所以你的复制解决方案要好得多。为此 +1
  • 你是对的 Marek,对 df1、df2、b 的分配(为什么首先是 b?)应该不在循环中。甚至 mu 也可以预先计算。为了保存 p.values,最糟糕的是在for 循环中使用p.values &lt;- c(p.values, t.test(...)) 增长一个向量。 replicate 在开头以某种方式预先分配了所需长度的向量,并避免缓慢的内存重新分配。对于长时间计算,请考虑可以显示进度条的 plyr 包。
  • 好吧,我对那个 calimo 有点困惑(也再次感谢您的帮助)我选择了 b,因为我将 2shared.com/document/lf3biLds/R_assignment_two.html
  • @Simon 要更改 df2 的输入,请将其作为函数参数包含在内。我编辑了我的答案以包含它。
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多