xtlogit在R - logit固定效果

时间:2018-02-20 20:24:48

标签: r binary panel

我正在试图弄清楚如何在R中执行固定效果logit回归(类似于Stata的xtlogit命令)。我读过几个包,比如“pglm”或“bife”,但无法让我的模型运行。

我的数据保存为数据框,如下所示:

ID   Time  Y  X
1    2000  1  0
1    2001  0  1
1    2002  1  1
...
1    2016  1  0
...
n

基本上我想运行固定效果logit回归:

 y_jt = beta*x_jt + mu_j + pi_t + epsilon_jt

其中j是ID,t是时间,mu是ID固定效果,pi是固定时间效应,eps是错误项。

我愿意使用任何包装。我从“bife”开始,但无法弄清楚如何设置ID和时间固定效果。我试过了:

 mod.no <- bife(y ~ x | ID, data = panel)

我是否需要将数据设置为Stata的“xtset”命令等面板?

非常感谢提前!

修改

我想在R中复制的Stata命令是:

xi: xtlogit Y X i.Time, fe

2 个答案:

答案 0 :(得分:0)

总的来说,我认为这里的策略是执行以下操作:

  1. 创建一个包含预测变量的个体级均值的变量。使用dplyr

    最容易实现

    data <- data $>$ group_by(ID) %>% mutate(X_mean = mean(X))

  2. 这里的神奇之处在于group_by函数,它导致mean操作计算组均值而非全局均值。

    1. 使用lme4将logit模型估计为多级模型。以下是我如何指定模型:

      glmer(Y ~ X + X_mean + Time + (1 | ID), family = binomial)

    2. 条款&#34;已修复&#34;和&#34;随机&#34;在面板数据,多级建模和其他一些文献之间真的很混乱,所以我并不完全清楚你如何概念化&#34;固定时间效应&#34;。此模型为您提供的是X的固定效果,因为X的系数将代表X的受试者内效果。我将Time作为预测因子,将年份视为额外的预测因子,其解释取决于它是连续的还是绝对的。有些人认为这是随机的&#34;效果(如随机斜率或某些文献a&#34;增长曲线&#34;)。你会这样做:

      glmer(Y ~ X + X_mean + Time + (Time | ID), family = binomial)

      估计每个人对时间的不同影响。

      第一个模型中的(1 | ID)和第二个模型中的(Time | ID)告诉lme4分组变量是什么,在您的情况下是ID。您可以在第一个模型中获得ID的随机截距,并在第二个模型中获得Time的随机截距和随机斜率。您对第一篇文章的另一种解释是,您希望对Time进行随机拦截,在这种情况下,您可以执行以下操作:

      glmer(Y ~ X + X_mean + (1 | Time) + (1 | ID), family = binomial)

      或者,如果波浪很少,您可以通过将Time作为预测变量并将该变量作为输入数据中的一个因子来到同一个地方。如果有许多时间点可能会使输出变得难以处理。

      我一直致力于一个软件包来自动化其中一些,受到来自Stata的xt套件的启发,尽管在这个时刻,我的软件包更加有限。它名为panelr,目前必须从GitHub下载。有关详情,请访问:https://github.com/jacob-long/panelr

      在这种情况下,使用panelr,您的情况将如下:

      library(panelr)
      pdata <- panel_data(data, id = ID, wave = Time)
      model <- wbm(Y ~ X, data = pdata, use.wave = TRUE, family = binomial)
      

      所有panelr正在做的是自动化我上面解释的内容。您可以使用X参数删除单个均值变量,而不会影响model = "within"的主题内效果的估计。

      panelr可能距离CRAN提交还有几个星期,因为有些事情需要记录,有一些边缘情况会出现意外中断,我希望在处理时间方面更加灵活

答案 1 :(得分:0)

或许尝试将Time变量强制转换为一个因子,就像您在Stata中所做的那样,并将其包含在bife公式中:

panel$Time <– as.factor(panel$Time)

mod.no <- bife(y ~ x + Time | ID, data = panel, bias_corr = "ana")

注意:您可能希望在最后使用bias_corr = "ana"来纠正偶然的参数偏差。

或者,使用clogit包中的survival函数也应该有效:

mod.no <– clogit(y ~ x + strata(Time) + strata(ID), data = panel

strata()选项表示固定效果。