【问题标题】:My function isn't recognized by my loop我的循环无法识别我的函数
【发布时间】:2014-12-10 17:43:41
【问题描述】:

我试图从平均值为 10.016 且标准差为 0.8862719 (n=20) 的正态分布中抽取一千次样本。我想创建一个循环来做到这一点。我尝试创建一个函数(stamendist)来从具有上述均值和标准差的正态分布中提取随机变量,但是当我运行循环时,我收到一条错误消息: 错误:找不到函数“stamendist”(即使我在运行循环之前运行了该函数)。

我尝试通过仅输入 rnorm(n=20,mean=10.016,sd=0.8862719) 来运行没有对象“stamendist”的循环,但同样的错误消息仍然存在。
这是我的代码:

stamendist <- rnorm(n=20,mean=10.016,sd=0.8862719)
sampled.means <- NA 

for(i in 1:1000){
    y=stamendist(100)
    sampled.means[i] <- mean(y)
}

我是否误解了函数的工作原理?我对 R 很陌生,所以任何帮助或建议将不胜感激。

【问题讨论】:

  • stamendist 是一个向量,而不是一个函数。所以stamendist(100) 没有意义
  • NA 初始化很老套,尝试用sampled.means &lt;- vector("numeric", 1e3L) 初始化。这会分配向量所需的确切内存量,而NA 只是一个接一个地构建一个向量。如果您知道向量将有多大,最好分配它的确切长度。
  • 感谢您的建议!

标签: r


【解决方案1】:

您不需要循环来获取样本均值的向量:

n <- 1000
sampled.means <- colMeans(matrix(rnorm(n = 20 * n, 10.016, 0.8862719), ncol = n))

【讨论】:

  • 谢谢,这真是个好建议!我知道我不必循环;我只是不确定如何使用替代方法。
【解决方案2】:

如果您希望stamentdist 成为一个函数,您需要将stamendist 分配为一个函数。函数的一般表示法是:

foo <- function(args, ...){
    expressions
}

然后您必须决定希望用户指定哪些参数。在您的具体示例中,我假设您希望用户指定观察次数。考虑到这一点,函数的外观如下:

stamendist <- function(n) {
  rnorm(n=n,mean=10.016,sd=0.8862719)
}

【讨论】:

    【解决方案3】:

    在这一行:

    stamendist <- rnorm(n=20,mean=10.016,sd=0.8862719)
    

    您为名为 stamendist 的向量分配 20 个值

    在这一行:

    y=stamendist(100)
    

    您尝试调用不存在的函数 stamendist。

    在循环内移动这条线:

    stamendist <- rnorm(n=20,mean=10.016,sd=0.8862719)
    

    因此,您为每次迭代创建一组新的随机数。 然后将stamendist 传递给均值函数。而且你根本不需要y

    【讨论】:

    • 谢谢!这很有帮助!
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 2021-02-13
    • 2018-03-28
    • 2018-06-22
    • 2020-01-27
    • 2011-07-20
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多