R mlogit模型,计算奇异

时间:2015-04-24 14:07:10

标签: r mlogit

我今天花了整整一天的时间与格式化data (在通过BondedDust&table;(TM)建议找到错误后更新)进行了适当的对比mLogit:

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

我真的会在这个主题上提供一些帮助。我不敢带点香蕉。

数据本身来自一个实验,在这个实验中,我们让1000个人在食物盘对之间做出决定(我们改变食物的外观 - 无论是角形还是圆形 - 并且改变板的形状 - 是角形还是圆形)。

祝福, 安迪。

PS害怕我是StackOverflow上有统计数据Q的新手。

3 个答案:

答案 0 :(得分:6)

模型无法将您的dishId解释为替代索引(alt.var),因为您有不同的密钥对用于不同的选择。例如,你有&#34; TS&#34;和&#34; RS&#34;作为.csv文件中第一个选择的备用索引键,但你有&#34; RR&#34;和&#34; RS&#34;作为选择的关键3634.此外,您还没有指定替代品的名称(alt.levels)。由于未填写alt.levels这一事实,mlogit.data会自动尝试根据替代索引检测替代方案,无法正确解释。这基本上是一切都出错的地方:&#39;食物&#39;和&#39;盘子&#39;变量不被解释为替代,但它们被视为个别特定变量,最终导致奇点问题。

您有两种方法可以解决此问题。您可以通过mlogit.data参数将实际替代项作为输入提供给alt.levels

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)

我们验证两个模型确实相同。模型1的结果:

> 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)

答案 1 :(得分:0)

这更多是评论而不是答案(我没有足够的回复评论!)。但是,由于m^2/n中没有任何age列,我无法重现您的代码。

答案 2 :(得分:0)

我有同样的问题,正在使用

df.long <- mlogit.data(Train, choice = "Loan.Type" ,shape="wide")
mod3.rural1 <- mlogit( Loan.Type ~1sex+married+age+havejob+educ+political.afl+ethnicity+region+income+liquid.assets+class.of.HH, data= df.long, reflevel = "No.Loan")
但是,收入与流动资产之间的相关性是0.50。但是在删除异常值之后,它找到了 您可以按照以下步骤删除异常值

df <- df[-which(df$column %in% boxplot(df$column, plot=FALSE)$out),]

希望对您有用,