我正在尝试在 R 中实现 beta-几何概率模型(如this whitepaper中所述),其中涉及求解具有两个未知参数的方程。在示例中,他们使用Excel执行此操作,在alpha = beta = 1
处启动值并将其约束为alpha > 0.0001 < beta
。
我几乎在 R 中实现了这一点,但我似乎无法让任何解算器为我工作。请帮忙。
# probability mass function
P = function (alpha, beta, t) {
out = numeric(length=length(t))
for (i in seq_along(t)) {
if (t[i]==1) {
out[i] = alpha / (alpha + beta)
} else {
out[i] = ((beta + t[i] - 2) / (alpha + beta + t[i] - 1)) * P(alpha, beta, t[i] - 1)
}
}
out
}
# survival probability function
S = function(alpha, beta, t) {
if (t==1) {
1 - P(alpha, beta, t=t)
} else {
S(alpha, beta, t - 1) - P(alpha, beta, t=t)
}
}
# log likelihood function
LL = function(alpha, beta=1, t, n) {
sum(n * log(P(1,1,t))) + (sum(n[1:length(n)-1]) * log(S(alpha, beta, t=t[length(t)])))
}
# make some test data
n = c(239L, 2650L, 1063L, 1014L, 473L, 1304L)
t = 1:6
# log likelihood
LL(alpha=1, beta=1, n=n, t=t)
# use numerical optimization to find values of alpha and beta
optim(c(1,1), fn=LL, n=n, t=t)
require(stats4)
mle(LL, start=list(alpha=1, beta=1), t=t, n=n)
答案 0 :(得分:4)
默认情况下,optim
会最小化,但您希望最大化LL
。此外,您希望使用L-BFGS-B之类的方法,它使用绑定信息:
optim(c(1, 1), function(x) -LL(x[1], x[2], n=n, t=t), method="L-BFGS-B",
lower=c(0.0001, 0.0001))
# $par
# [1] 0.0001 9679.3562
#
# $value
# [1] 17075.64
#
# $counts
# function gradient
# 87 87
#
# $convergence
# [1] 0
#
# $message
# [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
我们可以验证我们已经改进了对数可能性:
LL(1, 1, n=n, t=t)
# [1] -27659.45
LL(0.0001, 9679.3562, n=n, t=t)
# [1] -17075.64