我正在尝试使用自举来计算参数v的MLE的置信区间。但是在每次迭代中,n <- 10000
table(replicate(n, lost.balance()))/n
# FALSE TRUE
# 0.9902 0.0098
都给出相同的结果。为什么会这样?
这是我的代码:
optim()
输出为:
# Create log-likelihood function
dofloglik = function(v, x) { n <- length(x)
loglik <- n*lgamma((v+1)/2) - n*lgamma(v/2)
- (n/2)*log(v*pi) - ((v+1)/2)*sum(log(1+x^2/v))
return(-loglik) }
# Sample
y = c(0.97, 0.41, -0.13, -0.18, 1.69,
0.17, -0.46, -0.65, 2.66, -0.28,
2.30, -0.15, 0.24, 0.43, -0.54,
-1.55, 2.13, -0.48, 1.24, 1.05)
# Bootstrapping
n = length(y)
sims = 10
mle = numeric(sims)
for (i in 1:sims) {
bs = sample(y, n, replace=TRUE)
mle[i] = optim(1, dofloglik, x = bs, method = "CG")$par
print(bs)
}
mle = sort(mle)
mle
答案 0 :(得分:1)
> dofloglik = function(v, x) { n <- length(x)
+ loglik <- n*lgamma((v+1)/2) - n*lgamma(v/2)
+ - (n/2)*log(v*pi) - ((v+1)/2)*sum(log(1+x^2/v))
+ return(-loglik) }
>
> dofloglik(1, 1:4)
[1] 2.28946
> dofloglik(1, 2:5)
[1] 2.28946
> dofloglik(1, 3:6)
[1] 2.28946
那可能不是您想要的。
我怀疑不是您想要的部分是将某物分成两行。除了每行都是有效命令之外,因此R自己执行第一行。
+ loglik <- n*lgamma((v+1)/2) - n*lgamma(v/2)
+ - (n/2)*log(v*pi) - ((v+1)/2)*sum(log(1+x^2/v))
因此loglik <- n*lgamma((v+1)/2) - n*lgamma(v/2)
已运行且有效,因此将其存储到loglik中。第二行- (n/2)*log(v*pi) - ((v+1)/2)*sum(log(1+x^2/v))
有效。它执行但不存储任何内容,而且由于我们不在顶层,因此甚至无法打印。
您要么需要确保第一行的末尾不会导致完整的语句(通过在第一行的末尾添加减号),要么要做其他事情以另一种方式将其拆分。 / p>