r-Margins包命令运行时间过长



我希望使用这样的数据集(有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命令中的参数手动计算因变量的预测值,只是为了掌握结果。

欢迎提出任何替代方案。

我想我已经找到问题了。您的代码产生了一个错误,因为您有一个只有一个级别的因子DESCRICAO_SEXO

contrasts<-中的错误(*tmp*,值=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拟合的概率发生

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

我遇到了同样的问题,并做了两件事来解决它。首先,我将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))))

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

最新更新