多项逻辑
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
,依此类推。
这是必要的,因为在其他列中您使用 prod2
、prod3
等
我尝试运行 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
我被 运行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
,依此类推。
这是必要的,因为在其他列中您使用 prod2
、prod3
等
我尝试运行 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