【问题标题】:How to use optim() to produce coefficient estimates for a generalized linear model?如何使用 optim() 为广义线性模型生成系数估计?
【发布时间】:2021-06-28 14:09:49
【问题描述】:

我在R写了如下模型:

model1_b <- glm(bupacts ~ sex + couples + women_alone, data = risky, family = poisson(link="log"))

我想使用optim 查找此模型的系数估计值。也就是说,我想达到上述模型产生的系数与使用optim 产生的系数相匹配的程度。下面是似然函数的代码:

log.like <- function(par) {
    xb <- par[1] + par[2] * risky$sex + par[3] * risky$couples + par[4] * risky$women_alone
   lambda <- exp(xb)
    ll <- sum(log(exp(-lambda) * (lambda ^ risky$bupacts) / factorial(risky$bupacts)))
    return(-ll)}
result <- optim(c(0, 0, 0, 0), log.like, hessian = TRUE, method = "BFGS")

我不断收到错误消息:initial value in 'vmmin' is not finite。有人可以帮我吗?我不确定发生了什么。

【问题讨论】:

  • 这是一个很好的问题,但是我们可以请minimal reproducible example吗?您是否反对使用 dpois() 而不是您的手动泊松对数似然?
  • 我对此没有异议。 dpois() 的函数会是什么样子?
  • 您可以用ll &lt;- sum(dpois(risky$bupacts, lambda, log=TRUE)) 替换您的ll 行。 (它可能解决你的问题,因为你不会在对数转换之前计算可能性......)我们仍然想要一个可重现的例子来诊断你的起始值问题......跨度>
  • 谢谢——感谢您的帮助。我会试试这个。澄清一下,我发布的内容如何不是可重复的示例?我查看了您共享的链接,但我不清楚我还应该添加什么。
  • 我们没有您的数据 (risky)。您可以发布您的数据(或仍然会产生问题的数据子集),或者尝试找到同样复制问题的内置或模拟数据集。 stackoverflow.com/questions/5963269/… 是关于可重复性的规范 R 特定 Q ...

标签: r glm log-likelihood


【解决方案1】:

使用如下所示的负对数似然函数。

library(foreign)

# input
u <- file.path("http://www.stat.columbia.edu", 
  "~gelman/arm/examples/risky.behavior/risky_behaviors.dta")
risky <-  read.dta(u, convert.factors = TRUE)

# glm
model1_b <- glm(bupacts ~ sex + couples + women_alone, data = risky, 
  family = poisson(link = "log"))
coef(model1_b)
##   (Intercept)        sexman       couples   women_alone 
##  3.1743188102  0.0474967008  0.1448180037 -0.0007948884 

## glm using optim
neg.LL <- function(p) with(risky, {
   eta <- p[1] + p[2] * (sex == "man") + p[3] * couples +  p[4] * women_alone
  -sum(dpois(bupacts, lambda = exp(eta), log = TRUE))
})
fm <- lm(bupacts ~ sex + couples + women_alone, risky)
optim(coef(fm), neg.LL, method = "BFGS")

给予:

$par
  (Intercept)        sexman       couples   women_alone 
 3.1744020275  0.0474937915  0.1447499657 -0.0009630441 

$value
[1] 7083.872

$counts
function gradient 
     178       37 

$convergence
[1] 0

$message
NULL

【讨论】:

  • 性别变量的编码有问题。已更正。
  • 请注意,这也适用于起始值rep(0,length(coef(fm))),它更接近于 OP 的具体问题 ...
  • 似乎lm 系数与glm 系数并没有那么接近,事实上,在初始值为零的情况下,它在一半的迭代中收敛。如果我们从一开始就更少了。
猜你喜欢
  • 2017-06-26
  • 2016-03-14
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2022-07-22
  • 2022-01-24
  • 1970-01-01
  • 2020-01-29
相关资源
最近更新 更多