r - R:使用 MaxLik() 包估计 mle 时出错
问题描述
我的目的是使用 Newton Raphson 算法找到最大似然估计器,并将解决方案与 glm() 进行比较。所以我尝试在 R 中使用 maxLik() 。结果是错误,我以前没有使用过这个包,请修复这个错误,谢谢!
d <- read.delim("http://dnett.github.io/S510/Disease.txt")
d$disease=as.factor(d$disease)
d$ses=as.factor(d$ses)
d$sector=as.factor(d$sector)
str(d)
y<-as.numeric(as.character(d$disease))
x1<-as.numeric(as.character(d$age))
x2<-as.numeric(as.character(d$sector))
x3<-as.numeric(as.character(d$ses))
oreduced <- glm(disease ~ age + sector, family=binomial(link = logit), data=d)
summary(oreduced)
nlldbin=function(param){
eta<-param[1]+param[2]*x1+param[3]*(x2==2)
p<-1/(1+exp(-eta))
-sum(y*log(p)+(1-y)*log(1-p),na.rm=TRUE)
}
est_nr<-maxLik(nlldbin,start=c(0.01,0.01,0.01))
summary(est_nr)
结果是
Iteration 1
Parameter:
[1] 9841290 377928533 4325584
Gradient (first 30 components):
[,1] [,2] [,3]
[1,] NaN NaN NaN
Error in maxNRCompute(fn = function (theta, fnOrig, gradOrig = NULL, hessOrig = NULL, :
NA in gradient
解决方案
我们正在尝试最大化对数似然,但由于对总和施加了负数,您的函数正在最小化。因此,只需删除否定,给出:
nlldbin <- function(param){
eta <- param[1] + param[2]*x1 + param[3]*(x2==2)
p <- 1/(1+exp(-eta))
sum(y*log(p) + (1-y) * log(1-p), na.rm=TRUE)
}
这与其他优化器不同,例如optim
,默认情况下通常会最小化。这就是为什么你会像你一样否定总和。
ps您可以使用内置函数编写函数,这可能更稳定(并且打字更少):
nlldbin2 <- function(param){
eta <- cbind(1, x1, x2 == 2) %*% param
p <- plogis(eta)
sum(dbinom(y, 1, p, log=TRUE))
}
推荐阅读
- regex - 为什么不能在 oracle 中将 ']' 的字符与 regexp_like 匹配?
- python - 将数据框从 Python 写入 html 时修复表头
- java - org.hibernate.property.access.spi.PropertyAccessException:访问字段时出错 [private java.lang.String,
- css - 尝试在画布中垂直对齐文本时,`context.textBaseline = 'middle'` 不起作用
- c++ - C++ :: 在构造函数退出之前通过指针调用成员函数
- python - pychromecast 找不到任何设备
- javascript - 在运行时向 html 元素添加类未按预期工作
- ios - 如何通过排除 SPECIFIC .h .m 文件来安装 Pod 库或如何在 iOS 的 Pod 库中删除 SPECIFIC .h .m 文件
- c++ - 在数组行的结构下有一条红线显示表达式必须是可修改的左值错误
- c# - 在 ASP.NET Core Web API 的 HttpGet 方法中返回模型的单个属性