二项分布的R估计参数
我试图通过R中的最大似然从二项分布估计参数n和p 我正在使用stats包中的函数二项分布的R估计参数,r,R,我试图通过R中的最大似然从二项分布估计参数n和p 我正在使用stats包中的函数optim,但是有一个错误 这是我的代码: xi = rbinom(100, 20, 0.5) # Sample n = length(xi) # Sample size # Log-Likelihood lnlike <- function(theta){ log(prod(choose(theta[1],xi))) + sum(xi*log(theta[2])) + (n*theta[1] - sum(
optim
,但是有一个错误
这是我的代码:
xi = rbinom(100, 20, 0.5) # Sample
n = length(xi) # Sample size
# Log-Likelihood
lnlike <- function(theta){
log(prod(choose(theta[1],xi))) + sum(xi*log(theta[2])) +
(n*theta[1] - sum(xi))*log(1-theta[2])
}
# Optimizing
optim(theta <- c(10,.3), lnlike, hessian=TRUE)
xi=rbinom(100,20,0.5)#样本
n=长度(xi)#样本量
#对数似然
就像你为什么会遇到麻烦一样
如果您执行类似于(c(10,0.3))
,您将得到-Inf
。这就是为什么您的错误消息是抱怨lnlike
,而不是optim
通常,n
是已知的,只需要估计p
。在这种情况下,矩估计或最大似然估计都是封闭的,不需要数值优化。所以,估计n
真的很奇怪
如果您确实想进行估算,您必须意识到它是受约束的。检查
range(xi) ## 5 15
您的观测范围为[5,15]
,因此要求n>=15
。如何传递初始值10搜索n
的方向应该是从一个大的起始值开始,然后逐渐向下搜索,直到它达到max(xi)
所以,您可以尝试使用30
作为n
的初始值
此外,您不需要以当前方式定义lnlike
。这样做:
lnlike <- function(theta, x) -sum(dbinom(x, size = theta[1], prob = theta[2], log = TRUE))
解决方案?
本给了你一条路。我们手动对n
进行网格搜索,而不是让optim
来估计n
。对于每个候选n
,我们执行单变量优化w.r.t.p
。(哦,事实上,这里不需要进行数值优化。)这样,您就得到了n
的配置文件可能性。然后,我们在网格上找到n
,以最小化该轮廓的可能性
本已经向你提供了全部细节,我不再重复了。干得好(又快),本 tl;dr如果响应变量大于二项式N(即响应的理论最大值),则得到的可能性为零(因此为负无限对数可能性)。在大多数实际问题中,N是已知的,仅估计概率。如果确实要估计N,则需要(1)将其约束为>=样本中的最大值;(2) 对必须离散的参数进行特殊优化(这是一个高级/棘手的问题) 这个答案的第一部分显示了识别问题的调试策略,第二部分说明了同时优化N和p的策略(通过在合理的N范围内使用蛮力) 设置:
set.seed(101)
n <- 100
xi <- rbinom(n, size=20, prob=0.5) # Sample
好的,第一学期我们已经有麻烦了
prod(choose(theta[1],xi)) ## 0
产品是零。。。为什么?
choose(theta[1],xi)
## [1] 120 210 10 0 0 10 120 210 0 0 45 210 1 0
很多零。为什么?有问题的xi
值是什么
## [1] 7 6 9 12 11 9 7 6
啊哈!我们可以参加7,6,9。。。但是12岁的时候遇到了麻烦
badvals <- (choose(theta[1],xi)==0)
all(badvals==(xi>10)) ## TRUE
错误是什么?我不知道如何找到答案,但我也没有看到错误。。。你能把它寄出去吗??您的问题应该更多地集中在如何修复错误,而不是如何找到解决方案。(找到解决方案可能只是纠正错误…)@ZheyuanLi这是一个说明我所需要的示例。@ZheyuanLi感谢提醒我并给出答案。我同意我们可以只写下/解析求解给定N的p-hat,但是OP可能有一些理由在数字上这样做/想把它扩展到更复杂的例子中。Ben,我非常感谢你对我的帮助。还有一个问题。你认为矩量法比估计n的最大似然法好吗?最大似然法通常有更好的性质——它肯定有更好的渐近性质。MM是否足够好在很大程度上取决于您的应用。对于CrossValidated()来说,这可能是一个更好的问题。
prod(choose(theta[1],xi)) ## 0
choose(theta[1],xi)
## [1] 120 210 10 0 0 10 120 210 0 0 45 210 1 0
## [1] 7 6 9 12 11 9 7 6
badvals <- (choose(theta[1],xi)==0)
all(badvals==(xi>10)) ## TRUE
## likelihood function
llik2 <- function(p,n) {
-sum(dbinom(xi,prob=p,size=n,log=TRUE))
}
## possible N values (15 to 50)
nvec <- max(xi):50
Lvec <- numeric(length(nvec))
for (i in 1:length(nvec)) {
## optim() wants method="Brent"/lower/upper for 1-D optimization
Lvec[i] <- optim(par=0.5,fn=llik2,n=nvec[i],method="Brent",
lower=0.001,upper=0.999)$val
}
nvec[which.min(Lvec)] ## 20
par(las=1,bty="l")
plot(nvec,Lvec,type="b")