首页 > 解决方案 > if 函数中的错误:条件的长度 > 1,并且只使用第一个元素

问题描述

我有两个统计数据 在此处输入图像描述

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

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

错误:“在 if (data[i, ] < replicate(n, sqrt(2 * log(n)))) { : 条件的长度 > 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)))

标签: rfor-loopif-statementerror-handlingstatistics

解决方案


您收到该错误是因为您只能在if (...). 但是,data[1, ] < ...它是一个矢量化评估,它返回一个长度为 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)))

输出

历史


推荐阅读