r - 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)))
解决方案
您收到该错误是因为您只能在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)))
输出
推荐阅读
- angular - 使用 ngTemplate 使用 Angular 显示元素 html
- node.js - 在猫鼬中递归查找
- applescript - 在 AppleScript 中过滤记录
- javascript - Photoshop CC Javascript - 删除/剪切选区
- javascript - 在 onbeforeunload 事件期间执行调用
- php - 无法将 PHP7 安装到 AWS EC2 实例?
- python - 如何将参数传递给夹具并在测试方法中使用此夹具?
- ruby-on-rails-4 - 升级到 Rails 5.2 后 nil:NilClass 的未定义方法“expr”
- mysql - 使用 percona xtrabackup 将 Mysql 数据库迁移到 AroraDB
- python - Python-camelot(安装时出现错误:GhostscriptNotFound)