5

你能解释一下 R-Code 中循环的结构/思想吗?我不知道从哪里开始这个家庭作业问题。我能够创建我需要的指数分布

> rexp(n=200, rate=0.5) 

但现在我需要创建 2,000 个这个 rexp 的样本并计算每个样本的平均值。然后我需要计算 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 Workspace 对此没有回应,所以我命名了这个函数并尝试了这个:

>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

我应该怎么做?

4

5 回答 5

6

您刚刚创建了一个由 2000 个具有相同值的元素组成的非常好的向量 - 仅代表一次指数分布的样本平均值。通过检查y.exdi您的控制台来查看。

如果您想为此解决方案使用循环,则应在每次迭代中创建新样本。你可以很容易地做到这一点,例如sapply(循环包装for)应用于1:2000

sapply(1:2000, function(x) mean(rexp(n = 200, rate = 0.5)))

或者更确切地说直接调用例如replicate(旨在用于这种情况):

replicate(2000, mean(rexp(n = 200, rate = 0.5)))
于 2013-10-15T22:31:10.937 回答
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增加时生成的新向量。有了上面的代码,您可以使用 计算平均值mean(y.exdi),它为您提供 2000 个“平均值”的平均值。

于 2013-10-15T22:28:00.307 回答
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
于 2013-10-15T22:28:56.270 回答
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)

在其中您实际上分配给exdi200 个指数分布的随机生成值的数字向量,它没有定义函数。实际上,你不需要重新定义一个函数,你可以rexp每次调用。

R 还为这些类型的东西提供了快捷方式。您可以使用单线获得 2000 均值

sapply(1:2000, function(x) { mean(rexp(200, 0.5)) })
于 2013-10-15T22:29:32.440 回答
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))
于 2013-10-16T01:38:55.597 回答