【问题标题】:Margins package commands taking too long to run边距包命令运行时间过长
【发布时间】:2017-10-18 23:41:18
【问题描述】:

我希望使用这样的数据集(具有 40k 次观察)评估 logit 回归中变量的边际效应:

d1<- structure(list(dummy.eleito = c(1, 0, 0, 0, 0, 1, 1, 1, 1, 0), 
                     dummy.tratamento = c(1, 1, 0, 0, 0, 0, 0, 0, 0, 0), 
                     Escolaridade = c("SUPERIOR_INCOMPLETO", "FUNDAMENTAL_INCOMPLETO", 
                                      "SUPERIOR_COMPLETO", "FUNDAMENTAL_INCOMPLETO", 
                                     "SUPERIOR_COMPLETO", "SUPERIOR_COMPLETO", "SUPERIOR_INCOMPLETO", 
                                     "SUPERIOR_INCOMPLETO", "SUPERIOR_COMPLETO", "SUPERIOR_INCOMPLETO"), 
                     Raca = c("Preta_Parda", "Preta_Parda", "Preta_Parda", "Preta_Parda", 
                              "Preta_Parda", "Preta_Parda", "BRANCA", "BRANCA", "BRANCA", "BRANCA"),
                     DESCRICAO_SEXO = c("MASCULINO", "MASCULINO", "MASCULINO", 
                                        "MASCULINO", "MASCULINO", "MASCULINO", "MASCULINO", 
                                        "MASCULINO", "MASCULINO", "MASCULINO"), 
                     votos.cidade = c(6483, 6483, 6483, 6483, 6483, 6483, 4735, 
                                      4735, 4735, 4735), 
                     dummy.prefeito = c(0,1, 0, 0, 0, 1, 0, 0, 0, 1), 
                     Intensidade.Trat0.Mun = c(0.0152671755725191, 0.0152671755725191, 0.0152671755725191, 0.0152671751, 
                                               0.0152671755725191, 0.01526717, 0.02857142856, 0.028571428, 0.028571, 0.0285714), 
                     Var.Receitas = c(3.25607407, 11.424, 4.5549, -0.832116880227985, 5.78901737320675, -0.02459246, 
                                      1.151009, -0.3058719238, 0.742947247, -0.2711)), 
                .Names = c("dummy.eleito", "dummy.tratamento", "Escolaridade", "Raca", 
                           "DESCRICAO_SEXO", "votos.cidade", "dummy.prefeito", "Intensidade.Trat0.Mun", 
                           "Var.Receitas"), row.names = c(NA, 10L), class = "data.frame")

我使用glm: 运行以下回归

model <- glm(dummy.eleito ~  dummy.tratamento + factor(Escolaridade) +
                       factor(Raca) + factor(DESCRICAO_SEXO) +
                       votos.cidade + dummy.prefeito +
                       dummy.tratamento:Intensidade.Trat0.Mun +
                       Var.Receitas + Var.Receitas:dummy.tratamento, 
                       data = d1, 
                       family = binomial(link = 'logit'))

然后我在某些点评估边际效应:

m <- margins(model, at = list(dummy.tratamento = 1,
                              Intensidade.Trat0.Mun = fivenum(d1$Intensidade.Trat0.Mun)                               
                              Var.Receitas = fivenum(d1$Var.Receitas))

R 试图通过整个晚上运行这个......在早上,仍然没有。这正常吗?有什么可能的原因吗?数据是否过于复杂?或者也许是回归公式本身?即使我在不​​使用at 规范的情况下运行margins,它仍然不会运行。

有什么帮助吗?


编辑:

在将 R 更新到最新版本后,这就是我最终得到的结果:

使用整个数据集运行我需要的回归和margins 命令,R 花了一些时间来完成这项工作,但最终还是成功了。

但是,在margins 中使用at 参数时问题仍然存在。我怀疑这是因为回归有factor 变量。我想我可能会使用放在at 命令中的参数手动计算因变量的预测值,以便掌握结果。

欢迎任何建议的替代方案。

【问题讨论】:

  • 在您的问题中包含minimal reproducible example 会增加您获得答案的机会。
  • @jsb 只包含一个原始数据集的一小部分

标签: r logistic-regression non-linear-regression


【解决方案1】:

我想我找到了问题所在。你的代码产生了一个错误,因为你有一个因子 DESCRICAO_SEXO 只有一个级别:

contrasts&lt;-(*tmp*, value = contr.funs[1 + isOF[nn]]) 中的错误:
对比只能应用于具有 2 个或更多级别的因素

接下来,我建议您在glm 调用之外创建因素:

d1$dummy.eleito <- as.factor(d1$dummy.eleito)
d1$dummy.tratamento <- as.factor(d1$dummy.tratamento)
d1$Escolaridade <- as.factor(d1$Escolaridade)
d1$Raca <- as.factor(d1$Raca)
d1$DESCRICAO_SEXO <- as.factor(d1$DESCRICAO_SEXO)
d1$dummy.prefeito <- as.factor(d1$dummy.prefeito)

运行以下模型(不带DESCRICAO_SEXO)有效:

model <- glm(dummy.eleito ~  dummy.tratamento + Escolaridade + 
 Raca + votos.cidade + dummy.prefeito + Intensidade.Trat0.Mun + 
   Var.Receitas, data = d1, family = binomial(link = 'logit'))

但是,它仍然会抛出以下警告:

警告信息:glm.fit:拟合概率为 0 或 1 发生了

您可以阅读有关此警告的信息 herehere。此警告可能仅出现在您提供的小数据集中,而不出现在完整数据集中。你必须尝试看看。

【讨论】:

  • 使用完整数据集运行此回归我没有收到此警告。但是,我的主要问题仍然存在:margins 代码行无法运行
  • 你得到什么错误?我对margins函数不熟悉。
  • margins 是属于同名包的函数。 (cran.r-project.org/web/packages/margins/vignettes/…)。这实际上不是一个错误:R 只是一直在尝试运行命令,但从未结束它……不是说它崩溃了,它只是一直在运行
  • @ArthurCarvalhoBrito 根据您描述的行为,您有一个非常大的数据集,而且运行时间很长。不幸的是,margin 非常慢(例如,与它的 Stata 类似物相比)。等等吧。
  • 如果它是写在 CRAN 上的,那很可能是真的。
【解决方案2】:

我遇到了同样的问题并做了两件事来解决它。首先我将 R 更新到最新版本,然后我创建了一个包含我感兴趣的所有变量组合的新数据框,而不是包含超过 300000 次观察的原始数据框,例如:

newdata<- with(d1,data.frame(dummy.eleito= rep(seq(from =0,to = 1, by = 1)
    ,length(levels(Escolaridade)))
,Escolaridade= as.character(sapply(levels(Escolaridade),rep,2))))

然后我在新数据集上使用了边距,所以它给了我所有我感兴趣的组合的边际效应,并且没有花这么长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2018-07-03
    • 2013-06-17
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    相关资源
    最近更新 更多