R mlogit模型,计算上是奇异的。

3
我整个今天都在努力处理格式,以便适当地为mLogit格式化我的数据(在BondedDust的table(TM)建议下发现了一个错误后更新):

数据

raw <-read.csv("C:\\Users\\Andy\\Desktop\\research\\Oxford\\Prefs\\rData.csv", header=T, row.names = NULL,id="id")
raw <-na.omit(raw)

library(mlogit)

TM <- mlogit.data(raw, choice = "selected", shape = "long", alt.var = "dishId", chid.var = "individuals", drop.index = TRUE)

我在尝试对我的数据进行建模时遇到了困难。

model <- mlogit(selected ~ food + plate | sex + age +hand, data = TM)

在 solve.default(H, g[!fixed]) 中出现错误:系统计算上出现了问题: 倒数条件数 = 6.26659e-18

我希望能得到一些关于这个主题的帮助。恐怕我已经有点儿疯了。

数据本身来自一个实验,我们让成千上万的人在两个盘子之间做出选择(我们改变食物的外观 - 角形或圆形 - 并改变盘子的形状 - 角形或圆形)。

祝好, 安迪。

PS 恐怕我是 StackOverflow 上统计问题的新手。


1
使用“表格”查看是否可以确定导致问题的线性组合。 - IRTFM
我很困惑。你的回应是 dishId 还是 selected - Randy Lai
@RandyLai,我想知道其他因素(食物、盘子和性别[以及其他数据较少的因素])如何影响Selected。我输入数据时可能仍存在错误。 - andyw
@BondedDust 我的 CSV 文件确实包含了一些未包含数据的“单元格”,通过探索,我发现了我的 CrazyOutputFromTheseDevelopers.csv -> myData 程序的一个 bug。但是我现在害怕会遇到同样的错误! - andyw
solve() 中,使用一个更小的公差,例如 solve(..., tol = 1e-20)。这应该没问题,因为您得到的“倒数条件数 = 1.71139e-19”。更多信息请参见帮助文件这个相关问题 - Konstantinos
@andyw,如果你喜欢得到的答案,请使用复选框选项“接受”它! - DirtStats
2个回答

7

由于您在不同的选择中使用了不同的键值对,模型无法将您的dishId解释为备选索引(alt.var)。例如,在您的.csv文件中,第一个选择的替代索引键为“TS”和“RS”,但是在3634个选择中,您的键为“RR”和“RS”。此外,您还没有指定备选项的名称(alt.levels)。由于未填写alt.levelsmlogit.data将自动尝试基于备选索引检测备选项,它无法正确解释。这基本上是一切出错的地方:'food'和'plate'变量不被解释为备选项,而被视为最终导致奇异性问题的个体特定变量。

您有两个选项来解决此问题。您可以通过alt.levels参数将实际备选项作为输入提供给mlogit.data

TM <- mlogit.data(raw, choice = "selected", shape = "long", alt.levels = c("food","plate"),chid.var = "individuals",drop.index=TRUE)
model1 <- mlogit(selected ~ food + plate | sex + age +hand, data = TM)

或者,您可以选择使索引键一致,以便可以通过alt.var将其作为输入。现在mlogit.data能够正确地猜测您的替代品:

raw[,3] <- rep(1:2,nrow(raw)/2) # use 1 and 2 as unique alternative keys for all choices
TM <- mlogit.data(raw, choice = "selected", shape = "long", alt.var="dishId", chid.var = "individuals")
model2 <- model <- mlogit(selected ~ food + plate | sex + age +hand, data = TM)

我们验证两个模型确实是相同的。第一个模型的结果为:
> summary(model1)

Call:
mlogit(formula = selected ~ food + plate | sex + age + hand, 
    data = TM, method = "nr", print.level = 0)

Frequencies of alternatives:
   food   plate 
0.42847 0.57153 

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

Coefficients :
                    Estimate Std. Error t-value  Pr(>|t|)    
plate:(intercept) -0.0969627  0.0764117 -1.2689 0.2044589    
foodCirc           1.0374881  0.0339559 30.5540 < 2.2e-16 ***
plateCirc         -0.0064866  0.0524547 -0.1237 0.9015835    
plate:sexmale     -0.0811157  0.0416113 -1.9494 0.0512512 .  
plate:age16-34     0.1622542  0.0469167  3.4583 0.0005435 ***
plate:age35-54     0.0312484  0.0555634  0.5624 0.5738492    
plate:age55-74     0.0556696  0.0836248  0.6657 0.5055987    
plate:age75+       0.1057646  0.2453797  0.4310 0.6664508    
plate:handright   -0.0177260  0.0539510 -0.3286 0.7424902    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log-Likelihood: -8284.6
McFadden R^2:  0.097398 
Likelihood ratio test : chisq = 1787.9 (p.value = < 2.22e-16)

与模型2的结果相比较,可以看出备选方案被正确识别,但是其名称并未明确添加到模型中。
> summary(model2)

Call:
mlogit(formula = selected ~ food + plate | sex + age + hand, 
    data = TM, method = "nr", print.level = 0)

Frequencies of alternatives:
      1       2 
0.42847 0.57153 

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

Coefficients :
                Estimate Std. Error t-value  Pr(>|t|)    
2:(intercept) -0.0969627  0.0764117 -1.2689 0.2044589    
foodCirc       1.0374881  0.0339559 30.5540 < 2.2e-16 ***
plateCirc     -0.0064866  0.0524547 -0.1237 0.9015835    
2:sexmale     -0.0811157  0.0416113 -1.9494 0.0512512 .  
2:age16-34     0.1622542  0.0469167  3.4583 0.0005435 ***
2:age35-54     0.0312484  0.0555634  0.5624 0.5738492    
2:age55-74     0.0556696  0.0836248  0.6657 0.5055987    
2:age75+       0.1057646  0.2453797  0.4310 0.6664508    
2:handright   -0.0177260  0.0539510 -0.3286 0.7424902    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log-Likelihood: -8284.6
McFadden R^2:  0.097398 
Likelihood ratio test : chisq = 1787.9 (p.value = < 2.22e-16)

太棒了!非常感谢!我已经为此苦恼了一个多星期。 - andyw
@andyw,这个答案真的解决了你的问题吗?你有四种选择{RS,TS,RR,TR},对应{圆形,角度} x {食物,盘子}的四种可能组合。我不确定在这里使用多项式方法是否合适,因为人们只能从这四种选择中选择两种?特别是,在每次试验中,人们并没有在“食物”和“盘子”之间进行选择!我认为您可能需要尝试6种不同的二项式模型,以处理参与者所提供的6种不同的选择对{RS / TS,RS / RR,RS / TR,TS / RR,TS / TR,RR / TR }。 - logworthy
或者,您可以尝试使用两个二项式模型分别考虑每个因素?即一个模型用于比较圆形食物与角形食物(组合选择集{RS/TS,RR/TR}),另一个模型用于比较圆形盘子与角形盘子(组合选择集{RS/RR,TS/TR})。 - logworthy

0

这更像是一条评论而不是答案(我没有足够的声望来发表评论!)。然而,由于您的 rData.csv 中没有任何 age 列,因此我无法重现您的代码。


抱歉。我一直在处理一个更简单的模型,以防其他变量有问题。我已经添加了年龄。 - andyw
你看过这篇帖子吗?http://stackoverflow.com/questions/18978572/r-mlogit-on-my-data-giving-error-system-is-computationally-singular?rq=1 - utobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接