多项逻辑

multinomial logit

我被 运行R 中的多项式 logit 回归卡住了。附上数据预览以供参考。我应该怎么运行呢?我是 R 的新手,需要使用 R 为应用计量经济学做这件事。你能帮我重塑数据和运行宁多项式回归吗?

> head(data)
  marketindex x1_prod1 x2_prod1 x3_prod1 x1_prod2 x2_prod2 x3_prod2 x1_prod3 x2_prod3 x3_prod3 x1_prod0 x2_prod0 x3_prod0 choice
1           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      3
2           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      2
3           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      3
4           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      2
5           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      2
6           1 7.459917        1 7.267866  6.67054        1 7.633743 8.444682        0 11.30016        0        0        0      2

这是一个 link 到 R 中的多项逻辑回归示例,使用来自 nnet 包的 multinom 来自 UCLA。公式格式看起来与基础 R 的 lm 函数相同。

运行 R 中的多项式 Logit 模型可以在几个包中完成,包括 multinom 包和 mlogit 包。 mhmtsrmn 推荐的 UCLA 网站上的教程更喜欢 multinom 而不是 mlogit

because it does not require the data to be reshaped (as the mlogit package does)

但是,您提供的数据的形状已与 mlogit 包要求的格式兼容,因此如果您想使用 mlogit,则不需要再整形。不过,您确实需要按如下方式更改 choice 列中的编码:

  • 选项2必须改为prod2
  • 选择3必须改为prod3,依此类推。

这是必要的,因为在其他列中您使用 prod2prod3

我尝试运行 mlogit 对您的数据样本起作用,但失败了,很可能是因为该样本的值没有足够的变化。所以我将值更改为随机值并将数据框分配给 choice_dat 名称,如下所示:

choice_dat
 marketindex x1_prod1 x2_prod1 x3_prod1 x1_prod2 x2_prod2 x3_prod2 x1_prod3
1           1        5        7        6        5        2        8        7
2           1        8        3        5        6        3        9        8
3           1        7       10        3        7        6        9        9
4           1        8        8        2        5        8        9        7
5           1        9        9       10        8        4        6        8
6           1        7        4        8        7       10       10        8
  x2_prod3 x3_prod3 x1_prod0 x2_prod0 x3_prod0 choice1
1       10       13        0        0        0   prod3
2        3       10        0        0        0   prod2
3        4       10        0        0        0   prod3
4        1       11        0        0        0   prod2
5        8       10        0        0        0   prod2
6        5       12        0        0        0   prod2

然后,我运行mlogit要数据:

prod_dat <- dfidx(choice_dat, choice = "choice1", varying = c(2:13), sep = "_")
mod1<- mlogit(choice1 ~ x1 + x2 + x3|0, data = prod_dat)
summary(mod1)

Call:
mlogit(formula = choice1 ~ x1 + x2 + x3 | 0, data = prod_dat, 
    method = "nr")

Frequencies of alternatives:choice
  prod0   prod1   prod2   prod3 
0.00000 0.00000 0.66667 0.33333 

nr method
5 iterations, 0h:0m:0s 
g'(-H)^-1g = 9.53E-08 
gradient close to zero 

Coefficients :
   Estimate Std. Error z-value Pr(>|z|)
x1 -0.11412    0.38947 -0.2930   0.7695
x2  0.16461    0.17790  0.9253   0.3548
x3  0.26768    0.22651  1.1818   0.2373

Log-Likelihood: -5.8257

这是一个使用您的数据的 multinom(...) 示例。

library(data.table)
library(nnet)
setDT(data)
##
#   first method
#
data[
  , c('x1', 'x2', 'x3'):=mget(sapply(1:3, function(x) sprintf('x%d_prod%d', x, choice)))
  , by=.(1:nrow(data))]
fit.1 <- multinom(choice ~ x1 + x2 + x3, data)
fit.1
## Call:
## multinom(formula = choice ~ x1 + x2 + x3, data = data)
## 
## Coefficients:
## (Intercept)          x1          x2          x3 
##   -3.420470   -6.949344  -12.363971    6.679612 
##
## Residual Deviance: 0.0001212278 
## AIC: 4.000121 
##
#   alternate method
#
data.melt <- melt(data, measure.vars = patterns('_prod'))
data.melt[, prod.id:=gsub('^.+_prod(\d+)$', '\1',variable)]
data.melt[, variable:=gsub('^(.+)_.+$', '\1', variable)]
data.melt <- data.melt[choice==prod.id]
data.melt[, id:=seq(.N), by=.(variable, choice)]
mf <- dcast(data.melt, marketindex+choice+id~variable, value.var = 'value')
fit.2 <- multinom(choice ~ x1+x2+x3, mf)
fit.2
## Call:
## multinom(formula = choice ~ x1 + x2 + x3, data = mf)
##
## Coefficients:
## (Intercept)          x1          x2          x3 
##   -3.420470   -6.949344  -12.363971    6.679612 
##
## Residual Deviance: 0.0001212278 
## AIC: 4.000121