如何创建循环

时间:2013-10-15 22:15:28

标签: r loops statistics

你能解释一下R-Code中循环的结构/概念吗?我不知道从哪里开始这个家庭作业问题。我能够用

创建我需要的指数分布
> rexp(n=200, rate=0.5) 

但现在我需要为此rexp创建2,000个样本并计算每个样本的平均值。然后我需要计算2,000个样本均值的均值和方差。我知道如何找到简单分布的均值和方差(例如:mean(rexp)var(rexp)),因此我的主要问题是理解循环的概念并将其付诸行动。

所以我开始输入:

> rexp(n=200,rate=0.5)

然后我将这个指数分布命名为:

> exdi = rexp(n=200,rate=0.5)

根据处理总和的例子,我输入了

>y.exdi=vector(length=2000)
>for(i in 1:2000){y.exdi[ i ]=mean(exdi)}

R工作区没有对此做出任何回应,所以我命名了这个函数并尝试了这个:

>Twothou = for(i in 1:2000){y.exdi[ i ]=mean(exdi)}
>mean(Twothou)

但后来我收到了这条错误消息:

[1] NA
Warning message:
In mean.default(Twothou) : argument is not numeric or logical: returning NA

我应该采取哪些不同的方式?

5 个答案:

答案 0 :(得分:6)

你刚刚创建了一个非常漂亮的2000个具有相同值的元素的向量 - 用你的样本的均值来表示只为指数分布一次。请查看控制台中的y.exdi

如果要为此解决方案使用循环,则应在每次迭代中创建新样本和新样本。您可以轻松地使用例如应用于sapply的{​​{1}}(for循环的包装器):

1:2000

或者更确切地说直接打电话给sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5))) (打算用于此类案件):

replicate

答案 1 :(得分:3)

我认为您应该将随机数生成器rexp 放在}循环中

for

否则,对于每个y.exdi=vector(length=2000) for(i in 1:2000){ y.exdi[ i ]=mean(rexp(n=200,rate=0.5)) } ,您只需计算在循环外定义的固定向量的平均值,而不是每次索引i增加时生成的新向量。拥有上述代码后,您可以使用i计算平均值,它会为您提供2000“平均值”的平均值。

答案 2 :(得分:2)

您需要在循环中创建样本分发。试试这个:

> set.seed(1)
> y.exdi=vector(length=2000)
> for(i in 1:2000){
+ exdi = rexp(n=200,rate=0.5)
+ y.exdi[ i ]=mean(exdi)
+ }
> mean(y.exdi)
[1] 2.001149
> var(y.exdi)
[1] 0.01987367

答案 3 :(得分:2)

由于必须生成样本2000次,因此样本生成必须在循环中。

set.seed(1)
y.exdi <- vector(length=2000, "numeric")
for (i in 1:2000)
{
    y.exdi[i] <- mean(rexp(200, 0.5))
}

问题还在于命令

   exdi = rexp(n=200,rate=0.5)

其中您实际上为exdi分配了200个指数分布的随机生成值的数值向量,但它没有定义函数。实际上,您不需要重新定义函数,每次都可以调用rexp

R还为这些类型的东西提供了快捷方式。您可以使用单行

获得2000种方法
sapply(1:2000, function(x) { mean(rexp(200, 0.5)) })

答案 4 :(得分:0)

这是两个解决方案。第一个不需要创建示例两次,但匿名函数及其返回列表是奇数。第二个是更清洁,你确实得到了列名,但你不再将平均值与同一样本的方差联系起来。

library(plyr)

ldply(1:2000, function(x) {d <- rexp(n = 200, rate = 0.5); c(mean(d), var(d))})

ddply(data.frame(x = 1:2000), .(x), summarize, 
  mean = mean(rexp(n = 200, rate = 0.5)), var = var(rexp(n = 200, rate = 0.5)))

您的解决方案将值放在y.exdi列表中。如果在构造时查看其内容,它将充满布尔值的FALSE值。在循环之后,您可以重新检查它并看到它具有平均值作为其元素。这里有两个同样有效的方法来完成你试图用循环清理的东西。

y.exdi <- NULL
for(i in 1:2000) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5))

y.exdi <- vector(length = 2000, mode = "numeric")
for(i in seq(y.exdi)) y.exdi[i] <- mean(rexp(n = 200, rate = 0.5))