R多元逻辑回归(mlogit软件包)

时间:2019-11-25 01:24:19

标签: r regression multinomial mlogit

我尝试通过使用mlogit包来估计多项式逻辑回归,但出现了错误。我有205109个观察值,下面尝试执行代码和错误。

> Data <- read.csv("NWEScsv.csv",header=T)
> colnames(Data)
 [1] "NWSE"  "W.S"   "W.E"   "W.N"   "W.W"   "U.S"   "U.E"   "U.N"   "U.W"  
[10] "W.Not" "U.Not" "BW"    "BU" 
> movement = mlogit.data(Data, shape ="wide", varying = 2:11, choice = "NWSE")
> head(movement,15)
       NWSE     BW BU alt        W           U chid
1.E   FALSE 194.42  0   E 198.3434 2.47404e-10    1
1.N   FALSE 194.42  0   N 194.4160 1.41319e-10    1
1.Not  TRUE 194.42  0 Not 194.4200 0.00000e+00    1
1.S   FALSE 194.42  0   S 212.7249 2.08726e-10    1
1.W   FALSE 194.42  0   W 198.3434 1.37143e-10    1
2.E    TRUE 257.24  0   E 202.3502 8.05144e-10    2
2.N   FALSE 257.24  0   N 200.3368 4.59906e-10    2
> result.movement = mlogit(NWSE ~ 0 |BW+BU | W+U, movement)
 solve.default(H, g[!fixed]) error: 
  Lapack routine dgesv: system is exactly singular: U[20,20] = 0 

我该如何解决问题?

========

很抱歉,很长的问题。 据我所知,当我们尝试估计多元逻辑回归时,我们需要将解释变量分为三种类型。 (例如:U_ {ij} =α_{j} +β* X_ {ij} +γ_{j} Z_ {i} +δ_{j} W_ {ij} +ε_{ij}, X_ {ij},Z_ {i},W_ {ij}是三种类型)在mlogit包中,我们需要使用“ |”分隔变量方程将变为X_ {ij} | Z_ {i} | W_ {ij}。

无论尝试多少次,将变量放入W_ {ij}时都无法获得结果。 我在下面放了一部分数据结构。

> dput(head(movement, n = 25))
structure(list(NWSE = c(`1.E` = FALSE, `1.N` = FALSE, `1.Not` = TRUE, 
`1.S` = FALSE, `1.W` = FALSE, `2.E` = TRUE, `2.N` = FALSE, `2.Not` = FALSE, 
`2.S` = FALSE, `2.W` = FALSE, `3.E` = TRUE, `3.N` = FALSE, `3.Not` = FALSE, 
`3.S` = FALSE, `3.W` = FALSE, `4.E` = TRUE, `4.N` = FALSE, `4.Not` = FALSE,
`4.S` = FALSE, `4.W` = FALSE, `5.E` = TRUE, `5.N` = FALSE, `5.Not` = FALSE, 
`5.S` = FALSE, `5.W` = FALSE), BW = c(`1.E` = 194.42, `1.N` = 194.42,
`1.Not` = 194.42, `1.S` = 194.42, `1.W` = 194.42, `2.E` = 257.24, 
`2.N` = 257.24, `2.Not` = 257.24, `2.S` = 257.24, `2.W` = 257.24, 
`3.E` = 262.43, `3.N` = 262.43, `3.Not` = 262.43, `3.S` = 262.43, 
`3.W` = 262.43, `4.E` = 183.09, `4.N` = 183.09, `4.Not` = 183.09, 
`4.S` = 183.09, `4.W` = 183.09, `5.E` = 311.06, `5.N` = 311.06, 
`5.Not` = 311.06, `5.S` = 311.06, `5.W` = 311.06), BU = c(`1.E` = 0, 
`1.N` = 0, `1.Not` = 0, `1.S` = 0, `1.W` = 0, `2.E` = 0, `2.N` = 0, 
`2.Not` = 0, `2.S` = 0, `2.W` = 0, `3.E` = 0, `3.N` = 0, `3.Not` = 0, 
`3.S` = 0, `3.W` = 0, `4.E` = 0, `4.N` = 0, `4.Not` = 0, `4.S` = 0, 
`4.W` = 0, `5.E` = 0, `5.N` = 0, `5.Not` = 0, `5.S` = 0, `5.W` = 0
), alt = c(`1.E` = "E", `1.N` = "N", `1.Not` = "Not", `1.S` = "S", 
`1.W` = "W", `2.E` = "E", `2.N` = "N", `2.Not` = "Not", `2.S` = "S", 
`2.W` = "W", `3.E` = "E", `3.N` = "N", `3.Not` = "Not", `3.S` = "S", 
`3.W` = "W", `4.E` = "E", `4.N` = "N", `4.Not` = "Not", `4.S` = "S", 
`4.W` = "W", `5.E` = "E", `5.N` = "N", `5.Not` = "Not", `5.S` = "S", 
`5.W` = "W"), W = c(`1.E` = 198.3434254, `1.N` = 194.4159624, 
`1.Not` = 194.42, `1.S` = 212.7249464, `1.W` = 198.3434254, `2.E` = 
202.3502284, 
`2.N` = 200.33681, `2.Not` = 257.24, `2.S` = 219.2033856, `2.W` = 
204.383882, 
`3.E` = 208.5127103, `3.N` = 206.4379742, `3.Not` = 262.43, `3.S` = 
225.8791225, 
`3.W` = 210.6082979, `4.E` = 198.3434254, `4.N` = 194.4159624, 
`4.Not` = 183.09, `4.S` = 212.7249464, `4.W` = 198.3434254, `5.E` = 
 244.6919323, 
`5.N` = 239.8467074, `5.Not` = 311.06, `5.S` = 262.4340992, `5.W` = 
244.6919323
), U = c(`1.E` = 2.47e-10, `1.N` = 1.41e-10, `1.Not` = 0, `1.S` = 2.09e- 
  10, 
`1.W` = 1.37e-10, `2.E` = 8.05e-10, `2.N` = 4.6e-10, `2.Not` = 0, 
`2.S` = 6.73e-10, `2.W` = 4.46e-10, `3.E` = 6.53e-10, `3.N` = 3.73e-10, 
`3.Not` = 0, `3.S` = 5.51e-10, `3.W` = 3.62e-10, `4.E` = 2.47e-10, 
`4.N` = 1.41e-10, `4.Not` = 0, `4.S` = 2.09e-10, `4.W` = 1.37e-10, 
`5.E` = 2.65e-10, `5.N` = 1.52e-10, `5.Not` = 0, `5.S` = 2.24e-10, 
`5.W` = 1.47e-10), chid = c(`1.E` = 1L, `1.N` = 1L, `1.Not` = 1L, 
`1.S` = 1L, `1.W` = 1L, `2.E` = 2L, `2.N` = 2L, `2.Not` = 2L, 
`2.S` = 2L, `2.W` = 2L, `3.E` = 3L, `3.N` = 3L, `3.Not` = 3L, 
`3.S` = 3L, `3.W` = 3L, `4.E` = 4L, `4.N` = 4L, `4.Not` = 4L, 
`4.S` = 4L, `4.W` = 4L, `5.E` = 5L, `5.N` = 5L, `5.Not` = 5L, 
`5.S` = 5L, `5.W` = 5L)), reshapeLong = list(varying = structure(list(
W = c("W.S", "W.E", "W.N", "W.W", "W.Not"), U = c("U.S", 
"U.E", "U.N", "U.W", "U.Not")), v.names = c("W", "U"), times = c("S", 
"E", "N", "W", "Not")), v.names = c("W", "U"), idvar = "chid", 
timevar = "alt"), index = structure(list(chid = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L), .Label = c("1", "2", "3", "4", 
"5"), class = "factor"), alt = structure(c(1L, 2L, 3L, 4L, 5L, 
1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 
2L, 3L, 4L, 5L), .Label = c("E", "N", "Not", "S", "W"), class = "factor")), 
class = "data.frame", row.names = c("1.E", 
"1.N", "1.Not", "1.S", "1.W", "2.E", "2.N", "2.Not", "2.S", "2.W", 
"3.E", "3.N", "3.Not", "3.S", "3.W", "4.E", "4.N", "4.Not", "4.S", 
"4.W", "5.E", "5.N", "5.Not", "5.S", "5.W")), choice = "NWSE", row.names = 
c("1.E", 
"1.N", "1.Not", "1.S", "1.W", "2.E", "2.N", "2.Not", "2.S", "2.W", 
"3.E", "3.N", "3.Not", "3.S", "3.W", "4.E", "4.N", "4.Not", "4.S", 
"4.W", "5.E", "5.N", "5.Not", "5.S", "5.W"), class = c("mlogit.data", 
"data.frame"))

1 个答案:

答案 0 :(得分:1)

因此,您的数据看起来不完整,例如高共线性。我们可以通过检查数据的排名与预测变量的数量来测试这一点,如果排名不等于预测变量的数量,那么您将得到一个非唯一拟合,这就是您得到的错误

例如:

library(dplyr)
movement %>% 
    select_if(is.numeric) %>% 
    {
        cat("num predictors", ncol(.), "\n")
        qr(.) %>% 
            .$rank
    } 

收益:

num predictors 5 
[1] 4

您还可以通过查看预测变量的相关性来看到这一点:

movement %>% 
    select_if(is.numeric) %>% 
    cor()

哪种产量:

           BW BU          W          U       chid
BW   1.0000000 NA  0.7360761  0.2079872  0.4765022
BU          NA  1         NA         NA         NA
W    0.7360761 NA  1.0000000 -0.2686001  0.4933215
U    0.2079872 NA -0.2686001  1.0000000 -0.1964596
chid 0.4765022 NA  0.4933215 -0.1964596  1.0000000

例如,这表明BW和W提供基本相同的信息。我不知道您的主题,但您可能不应在模型中同时包含这两个预测变量。 BU也没有任何变化,因此将引发错误。