Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二项分布的R估计参数_R - Fatal编程技术网

二项分布的R估计参数

二项分布的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(

我试图通过R中的最大似然从二项分布估计参数np

我正在使用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(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")