你能解释一下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
我应该采取哪些不同的方式?
答案 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
放在1>}循环中:
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))