计算glmnet中模型的对数似然?

机器算法验证 可能性 网络 越轨
2022-04-03 14:11:26

glmnet() 返回一个 lambda 序列 fitobj$lambda ,我想计算由 lambda 序列定义的模型 (LL_model) 的对数似然。

显而易见的解决方案是只取参数并手动计算每个模型的 LL。但是,这不是很优雅而且很慢。因此,我试图从 glmnet 返回的偏差度量中计算 LL_model。

glmnet-object 给了我:

1) nulldev = 2*(LL_sat - LL_null),其中LL_sat是饱和模型,LL_null是NULL模型(一个值)

2) dev.ratio = 1 - dev.model/nulldev,其中 dev.model 是手头模型的偏差(k 值,对于 k lambda 值/模型)

3) 和 glmnet:::deviance.glmnet 给了我 dev_model = (1-dev.ratio) nulldev dev.model = 2 (LL_sat - LL_model) (k 值,k lambda 值/模型)

要计算每个模型的 LL,我会执行以下操作:

1) 计算 LL_null

2) 为 LL_sat 求解 (1) 并计算 LL_sat(一个值)

3) 求解 (3) 的 LL_model 并计算 LL_model (k 向量)

现在,我的两个问题是:

1)这个NULL模型是如何定义的?glmnet 手册说“NULL 模型是指拦截模型”。但是对于整个 lambda 序列只有一个 NULL 模型和 nulldev 的事实,我有点困惑。这个截距模型是根据哪个 lambda 计算的?我觉得我错过了一些东西。

2) 有没有人看到一种更简单的方法来计算序列中每个模型的 LL?最终目标是计算每个模型的 (E)BIC。我对原来如此乏味的事实感到惊讶。

任何帮助将不胜感激!

1个回答

这是计算逻辑(和概率)回归的对数似然的一种可靠方法,无论它是如何估计的。您所需要的只是相关的虚拟值和拟合值。

我只用一个常数在一个模型上测试了这个函数,它似乎运行良好。计算对数似然度并不难——所以只需将其写下来并手动计算即可。然后,只要始终在任何地方使用相同的函数,您的计算就会保持一致。

我真的不知道为什么 logLik 还不兼容 glmnet。Penalized pseudo-R2 通常用于拟合度量,您需要它作为信息标准,并且使用该值来计算大量测试统计数据似乎更方便。无论如何,这里供将来参考:

 logit_logLik <- function(dummy,fitted_values){
   # Description: Computes log-likelihood of a fitted
   # logit model 

   # Format variables
   y <- as.matrix(dummy)
   p <- as.matrix(fitted_values)
   # Adjust dimensions
   skip <- dim(y)[1] - dim(p)[1]
   y    <- as.matrix(y[-c(1:skip),])

   # Compute log-likelihood
   item <- sapply(1:dim(y)[1], function(i)
                          y[i,]*log(p[i,]) + (1-y[i,])*log(1-p[i,]))
   return(sum(item))
 }