【问题标题】:Error in the if function: the condition has length > 1 and only the first element will be usedif 函数中的错误:条件的长度 > 1,并且只使用第一个元素
【发布时间】:2021-02-17 01:08:40
【问题描述】:

我有两个统计数据

我想使用 1000 次重复来绘制 L 波浪号的直方图,其中 γ = 0.9*\sqrt{2logn},n=1000。我为 L 编写了函数,为 L 波浪号编写了一个“for, if”循环。但是我在“if”循环中得到了错误,当我使用“replicate”生成直方图时,它只给了我 1000 个相同的值。

你能帮我解决这个错误以及如何使用 1000 个重复来绘制直方图吗?谢谢!

错误:“在 if (data[i, ] 1,并且只使用第一个元素"

n=10^3
del = 0.9*sqrt(2*log(n))
data <- matrix(replicate(n,rnorm(n,0,1)),nrow = n)
L = n^{-1}*sum(exp(del*data[1,]-0.5*del^2))

#L tilde
est_L <- function(n){
  est=0
  for (i in 1:n){
    if (data[i,]<sqrt(2*log(n))){
      est = est +  n^{-1}*sum(exp(del*data[1,]-0.5*del^2))
    }
    return(est)
  }
}

#repeat 1000 times
hist(replicate(1000,est_L(10^3)))

【问题讨论】:

    标签: r for-loop if-statement error-handling statistics


    【解决方案1】:

    您收到该错误是因为您只能评估 if (...) 中的单个 T/F。但是,data[1, ] &lt; ... 是一个矢量化评估,它返回一个长度为 n 的 T/F 向量(即,对于上述情况,为 1000)。不过,我认为您的第二个函数 (est_L) 与该图像中显示的等式不匹配。请考虑以下实现:

    L <- function(n) {
      del <- 0.9 * sqrt(2 * log(n))
      data <- rnorm(n)
      mean(exp(del * data - 0.5 * del * del))
    }
    
    L_tilde <- function(n) {
      del <- 0.9 * sqrt(2 * log(n))
      data <- rnorm(n)
      mean(exp(del * data * ifelse(data < sqrt(2 * log(n)), 1, 0) - 0.5 * del * del))
    }
    

    那么你就可以了

    hist(replicate(1000, L_tilde(1000)))
    

    输出

    【讨论】:

    • 好的,我明白了。但数据应该是一个包含 1000 个样本的 n*n 矩阵(每个样本有 1000 个观察值)。然后我的数据代码``` data
    • 但是对于每次迭代,您只使用该矩阵的一行(1000 obs)对吧?然后您不必将所有数据存储在矩阵中。上面的函数(L 或 L_tilde)每次调用时都会从正态分布生成 1000 个新值。这相当于您的程序,但内存效率更高。 @user13696679
    • 嗨@user13696679,如果这个或任何其他答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多