R:如何将我的数据格式化为多项式 Logit?

2024-03-20

我正在 R 上复制一些 Stata 代码,我想使用以下命令执行多项式逻辑回归:mlogit函数,来自同名包(我知道有一个multinom函数于nnet但我不想用这个)。

我的问题是,使用mlogit,我需要使用以下方式格式化我的数据mlogit.data我不知道如何正确格式化它。将我的数据与文档和示例中使用的数据进行比较这个问题 https://stackoverflow.com/questions/9355535/how-should-i-format-my-data-for-the-r-mlogit-package,我意识到它不是同一个形式。

事实上,我使用的数据是这样的:

df <- data.frame(ID = seq(1, 10),
                 type = c(2, 3, 4, 2, 1, 1, 4, 1, 3, 2),
                 age = c(28, 31, 12, 1, 49, 80, 36, 53, 22, 10),
                 dum1 = c(1, 0, 0, 0, 0, 1, 0, 1, 1, 0),
                 dum2 = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 0))

   ID type age dum1 dum2
1   1    2  28    1    1
2   2    3  31    0    0
3   3    4  12    0    1
4   4    2   1    0    1
5   5    1  49    0    0
6   6    1  80    1    0
7   7    4  36    0    1
8   8    1  53    1    0
9   9    3  22    1    1
10 10    2  10    0    0

而他们使用的数据如下:

         key altkey    A      B   C D
1  201005131      1  2.6 118.17 117 0
2  201005131      2  1.4 117.11 115 0
3  201005131      3  1.1 117.38 122 1
4  201005131      4 24.6     NA 122 0
5  201005131      5 48.6  91.90 122 0
6  201005131      6 59.8     NA 122 0
7  201005132      1 20.2 118.23 113 0
8  201005132      2  2.5 123.67 120 1
9  201005132      3  7.4 116.30 120 0
10 201005132      4  2.8 118.86 120 0
11 201005132      5  6.9 124.72 120 0
12 201005132      6  2.5 123.81 120 0

正如你所看到的,在他们的例子中,有一列altkey详细说明了每个类别的每个key还有一个专栏D显示该人选择了哪种替代方案。

但是,我只有一栏(type)它显示了个人的选择,但没有显示其他替代方案或每个替代方案的其他变量的值。当我尝试申请时mlogit, 我有:

library(mlogit)
mlogit(type ~ age + dum1 + dum2, df)

data.frame(lapply(index, function(x) x[drop = TRUE]), row.names = rownames(mydata)) 中的错误: 提供的行名称长度错误

因此,如何格式化我的数据,使其与数据类型相对应mlogit需要?

Edit:按照@edsandorf的建议,我修改了我的数据框并mlogit.data有效,但现在所有其他解释变量对于每个替代方案都具有相同的值。我是否应该在所选替代项为 0 或 FALSE 的行中将这些变量设置为 0 ? (事实上​​,有人可以告诉我从我所在的位置到结果的过程吗?mlogit因为我不明白我的估计错在哪里?)

我在这里显示的数据(df)不是我的真实数据。然而,它的形式完全相同:一列包含替代项的选择(type)、包含虚拟人和年龄的列等。

这是我到目前为止所做的过程(我没有将替代项设置为 0):

# create a dataframe with all alternatives for each ID
qqch <- data.frame(ID = rep(df$ID, each = 4),
                   choice = rep(1:4, 10))

# merge both dataframes
df2 <- dplyr::left_join(qqch, df, by = "ID")

# change the values in stype by 1 or 0
for (i in 1:length(df2$ID)){
  df2[i, "type"] <- ifelse(df2[i, "type"] == df2[i, "choice"], 1, 0)
}

# format for mlogit
df3 <- mlogit.data(df2, choice = "type", shape = "long", alt.var = "choice")
head(df3)

    ID choice  type age dum1 dum2
1.1  1      1 FALSE  28    1    1
1.2  1      2  TRUE  28    1    1
1.3  1      3 FALSE  28    1    1
1.4  1      4 FALSE  28    1    1
2.1  2      1 FALSE  31    0    0
2.2  2      2 FALSE  31    0    0

如果我做 :

mlogit(type ~ age + dum1 + dum2, df3)

我有错误:

solve.default(H, g[!fixed]) 中的错误:系统在计算上是奇异的:条件数倒数


除非我们做出更多假设,否则您的数据不适合使用 MNL 模型进行估计。一般来说,由于所有变量都是个体特定的,并且不会因替代方案(类型)而异,因此无法识别模型。除非我们将它们视为替代特定特征,否则您的所有个人特定特征都将被删除。听起来,每个专业项目都有其自身的意义。在这种情况下,我们可以仅使用常量来估计 MNL 模型,其中常量捕获了使个人选择它的程序的所有信息。

library(mlogit)
df <- data.frame(ID = seq(1, 10),
                 type = c(2, 3, 4, 2, 1, 1, 4, 1, 3, 2),
                 age = c(28, 31, 12, 1, 49, 80, 36, 53, 22, 10),
                 dum1 = c(1, 0, 0, 0, 0, 1, 0, 1, 1, 0),
                 dum2 = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 0))

现在,为了安全起见,我为每个程序创建虚拟变量。type_1参考方案1,type_2编程 2 等

qqch <- data.frame(ID = rep(df$ID, each = 4),
                   choice = rep(1:4, 10))

# merge both dataframes
df2 <- dplyr::left_join(qqch, df, by = "ID")

# change the values in stype by 1 or 0
for (i in 1:length(df2$ID)){
  df2[i, "type"] <- ifelse(df2[i, "type"] == df2[i, "choice"], 1, 0)
}

# Add alternative specific variables (here only constants)
df2$type_1 <- ifelse(df2$choice == 1, 1, 0)
df2$type_2 <- ifelse(df2$choice == 2, 1, 0)
df2$type_3 <- ifelse(df2$choice == 3, 1, 0)
df2$type_4 <- ifelse(df2$choice == 4, 1, 0)

# format for mlogit
df3 <- mlogit.data(df2, choice = "type", shape = "long", alt.var = "choice")
head(df3)

现在我们可以运行模型了。我包含了每个备选方案的虚拟模型,并保留备选方案 4 作为我的参考水平。仅识别 J-1 个常数,其中 J 是替代方案的数量。在公式的后半部分(在管道运算符之后),我确保删除模型将创建的所有替代特定常量,并添加您的各个特定变量,将它们视为替代特定变量。请注意,只有当您的替代方案(程序)具有意义并且不通用时,这才有意义。

model <- mlogit(type ~ type_1 + type_2 + type_3 | -1 + age + dum1 + dum2,
                reflevel = 4, data = df3)
summary(model)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:如何将我的数据格式化为多项式 Logit? 的相关文章

随机推荐