2017-10-18 148 views
0

我想用这样的数据集(与40K的意见),以评估在分对数回归变量的边际效应:边距软件包命令花费太长时间运行

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试图通过整个晚上运行...在早上,仍然没有。这是正常的吗?任何可能的原因?数据是否太复杂?或者,也许回归公式本身?即使我运行margins而不使用at规范,它仍然不会。

任何帮助?


编辑:

更新R后,它的最新版本,这就是我到底得了:

使用整个数据集运行我需要的回归和margins命令,R需要时间来完成这项工作,但最终确实如此。

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

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

+0

在你的问题中包括一个[最小可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)将增加你获得答案的机会。 – jsb

+0

@jsb只包括一个与原始数据集的一小部分 –

回答

1

我想我已经找到了问题。因为你有一个因素DESCRICAO_SEXO仅有一层您的代码产生一个错误:

Error in contrasts<- (*tmp* , value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels

接下来,我建议你创建你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')) 

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

Warning message: glm.fit: fitted probabilities numerically 0 or 1 occurred

您可以阅读关于此警告herehere。此警告可能只发生在您提供的小数据集中,而不发生在完整数据集中。你必须尝试看看。

+0

用完整的数据集运行此回归我没有得到此警告。但是,我的主要问题依然存在:'margin'行代码不会运行 –

+0

你会得到什么错误?我不熟悉'margins'函数。 – jsb

+0

“边距”是属于同名软件包的函数。 (https://cran.r-project.org/web/packages/margins/vignettes/TechnicalDetails.pdf)。 它实际上不是一个错误,R只是不断尝试永远运行的命令,但上房它......不就是它崩溃,它只是不断永远 –