首页 > 解决方案 > R:GLM 模型和 optim() 包之间的估计参数不同

问题描述

我想用 R 中的 optim() 包找到估计参数。我将我的结果与 R 中的 GLM 模型进行比较。代码是

d <- read.delim("http://dnett.github.io/S510/Disease.txt")
d$disease=factor(d$disease)
d$ses=factor(d$ses)
d$sector=factor(d$sector)
str(d)

oreduced <- glm(disease~age+sector, family=binomial(link=logit), data=d)
summary(oreduced)

y<-as.numeric(as.character(d$disease))
x1<-as.numeric(as.character(d$age))
x2<-as.numeric(as.character(d$sector))

nlldbin=function(param){
  eta<-param[1]+param[2]*x1+param[3]*x2
  p<-1/(1+exp(-eta))
  -sum(y*log(p)+(1-y)*log(1-p),na.rm=TRUE)
}
MLE_estimates<-optim(c(Intercept=0.1,age=0.1,sector2=0.1),nlldbin,hessian=TRUE)

MLE_estimatesenter

GLM 模型的结果

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.15966    0.34388  -6.280 3.38e-10 ***
age          0.02681    0.00865   3.100 0.001936 ** 
sector2      1.18169    0.33696   3.507 0.000453 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

并使用 optim()

$par
  Intercept         age     sector2 
-3.34005918  0.02680405  1.18101449 

有人可以告诉我为什么它不同以及如何解决这个问题吗?谢谢

标签: rpackageglmmle

解决方案


你给了 R 两个不同的问题。在您的 GLM 中,公式中的所有参数都是因子变量。这意味着您已经告诉 R 它们只能采用特定的值(例如d$disease,只能采用值 0 和 1)。在您的 MLE 方法中,您已将它们转换为数值变量,这意味着它们可以采用任何值,并且您的数据恰好使用一小组值。

“修复”是只给 R 一个要解决的问题。例如,如果您改为 fit glm(y~x1+x2, family=binomial(link=logit)),它不使用因子变量,则 MLE 的参数估计值与拟合模型的参数估计值几乎相同。你以前见过这个


推荐阅读