使用 mlogit 分析排序数据

机器算法验证 r 回归 多项分布 罗吉特 mlogit
2022-04-16 06:24:53

我正在尝试使用此处描述的 logit 模型(更具体地说是 5.1 中的模型)分析排序数据。现在我对任何协变量的影响不感兴趣,只想通过查看相应的对数几率来评估项目的具体差异。如果我理解正确,我可以通过仅包含一个常数项作为单个特定变量并删除任何其他截距来实现这一点。我在 R 中使用 mlogit 包,并从我从小插图中收集到的内容(尤其是 2.8 中排序 logit 模型的示例)我尝试执行以下操作:

library(mlogit)
data("Game", package = "mlogit")
G <- mlogit.data(Game, shape="wide", choice="ch", varying=1:12, ranked=TRUE)
summary(mlogit(ch ~ 1 | -1 | -1,G))

这让我收到以下错误消息:

Error in `rownames<-`(`*tmp*`, value = c("1.GameBoy", "1.GameCube", "1.PC",  :
attempt to set 'rownames' on an object with no dimensions

很明显,我对 mlogit 公式的构造方式有一个误解,所以我试着玩了一下,我得到的唯一看起来像我想要的东西如下:

    Call:
mlogit(formula = ch ~ alt | -1 | -1, data = G, method = "nr", 
    print.level = 0)

Frequencies of alternatives:
    GameBoy    GameCube          PC PlayStation  PSPortable        Xbox 
    0.13846     0.13407     0.17363     0.18462     0.17363     0.19560 

nr method
4 iterations, 0h:0m:0s 
g'(-H)^-1g = 0.000575 
successive function values within tolerance limits 

Coefficients :
                        Estimate Std. Error t-value  Pr(>|t|)    
GameCube:(intercept)    0.058678   0.182572  0.3214  0.747911    
PC:(intercept)          1.275749   0.194292  6.5661 5.164e-11 ***
PlayStation:(intercept) 1.273903   0.191226  6.6618 2.705e-11 ***
PSPortable:(intercept)  0.622355   0.181645  3.4262  0.000612 ***
Xbox:(intercept)        1.401230   0.189758  7.3843 1.532e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log-Likelihood: -546.82

然而,这并不是很令人满意,因为对我来说,将替代方案作为个体特定的协变量包括在内似乎很奇怪。任何有经验的人都可以使用 mlogit 包在 R 中拟合这样的模型吗?

PS:我不确定这个问题是否更适合 CV 或 StackOverflow,但由于基础问题是一个统计问题,我选择将它放在这里。

2个回答

我的包装经验仍然相当有限mlogit,但如果我正确阅读了羊角面包小插图(参见第 1.2 节模型描述的开头,第 7 页),则alt模型中的变量被指定为具有通用系数的替代特定变量,而不是作为个体特定的协变量---这些变量放置在管道之间。

我使用了您最后提到的模型格式,并且能够重现 J Marden 文本(分析和建模排名数据)中示例 8.1 中列出的 LRS:

> exData = t(matrix(c(c(1,2,4,3,5), c(2,1,4,3,5), c(2,3,5,4,1), rep(c(2,1,5,3,4), 3)), nrow=5))
> exData
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    4    3    5
[2,]    2    1    4    3    5
[3,]    2    3    5    4    1
[4,]    2    1    5    3    4
[5,]    2    1    5    3    4
[6,]    2    1    5    3    4
> exTbl = as.data.table(exData)[, id := 1:.N][, melt(.SD, id.vars='id')][order(id, variable)][, setnames(.SD, 'value', 'ch')][, setnames(.SD, 'variable', 'alt')]
> exTbl %>% head
   id alt ch
1:  1  V1  1
2:  1  V2  2
3:  1  V3  4
4:  1  V4  3
5:  1  V5  5
6:  2  V1  2
> exLogit = mlogit.data(exTbl, shape='long', ranked=T, choice='ch', alt.var='alt', id.var='id')
> exLogit %>% head
     id alt    ch
1.V1  1  V1  TRUE
1.V2  1  V2 FALSE
1.V3  1  V3 FALSE
1.V4  1  V4 FALSE
1.V5  1  V5 FALSE
2.V2  1  V2  TRUE
> m1 = summary(mlogit(ch ~ alt | -1 | -1, exLogit, reflevel='V5'))
> m1

Call:
mlogit(formula = ch ~ alt | -1 | -1, data = exLogit, reflevel = "V5", 
    method = "nr", print.level = 0)

Frequencies of alternatives:
    V5     V1     V2     V3     V4 
0.1667 0.2500 0.2500 0.0833 0.2500 

nr method
6 iterations, 0h:0m:0s 
g(-H)^-1g = 4.08E-06 
successive function values within tolerance limits 

Coefficients :
               Estimate Std. Error t-value Pr(>|t|)   
V1:(intercept)    4.182      1.465    2.86   0.0043 **
V2:(intercept)    4.689      1.514    3.10   0.0020 **
V3:(intercept)   -0.726      0.867   -0.84   0.4024   
V4:(intercept)    2.061      1.133    1.82   0.0690 . 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log-Likelihood: -14.4
> llNull = -sum(log(1:5)) * 6
> llNull
[1] -28.72
> m1$logLik
'log Lik.' -14.4 (df=4)
> LRS = 2 * (m1$logLik - llNull)
> LRS
'log Lik.' 28.64 (df=4)
> 
[0] 0:NvimR*    

我从另一个 stats 包中提升了计算空模型对数似然的方法,因此它可能/可能不正确。虽然使用它确实使结果与文本中的示例 8.1 一致,所以它可能是正确的。

令我惊讶的是,空模型的对数似然值只是备选方案数量和受试者数量的函数,不受观察到的数据的影响。观察到的数据似乎只影响替代模型的对数似然性。如果有人对为什么会这样有一个直观的解释,请随时将其添加到这篇文章中。