在 R 中使用 lm() 拟合固定效应模型,没有单独的截距

Fit a fixed effect model with lm() in R without individual intercepts

我正在研究面板回归并决定切换到 lm(),因为 plm() 没有很好的 predict() 测试数据函数(以及 linearmodels Python) 和 lme4 语法对我这个计量经济学新手来说并不直观。

我想使用 lm 并预测未见过的数据。

我的 lm() 方程看起来像这样,作者作为固定效应

fit <- lm(y ~ a + b + factor(author), data = train)

显然,它会打印出数千个单独的系数。如何在 lm() 中构建模型,在不单独打印的情况下对所有作者进行评估?

让我们假设一些具体的数据示例,例如

a <- rnorm(100)
b <- runif(100)

train <- data.frame(a, b, 
                    author = sample(LETTERS[1:10], 100, 1),
                    y = 3*a + .5*b + rnorm(100))

现在我们做一个固定效应回归,我假设我们不需要任何拦截所以命令是

fit <- lm(y ~ a + b + author - 1, data = train)

公式中的 - 1 部分省略了 Intercpet,而是为每个 author 计算固定效应。没有遗漏基本级别。

打印此模型或其摘要对于示例中的 10 位作者是可行的,但对于您的工作中的数千位作者则不可行。

您只能像这样打印 ab 的系数

> fit$coefficients[c('a', 'b')]
         a          b 
3.02022335 0.09789947 

您可以通过 anova 命令查看系数及其 p-values

> anova(fit)

Analysis of Variance Table

Response: y
          Df  Sum Sq Mean Sq   F value    Pr(>F)    
a          1 1139.90 1139.90 1034.2307 < 2.2e-16 ***
b          1    7.73    7.73    7.0127  0.009591 ** 
author    10   10.75    1.07    0.9751  0.470812    
Residuals 88   96.99    1.10 

您甚至可以为系数解构 summary(fit) 或显示调整后的 R²:

> summary(fit)$coefficients[c("a", "b"),]
    Estimate Std. Error    t value     Pr(>|t|)
a 3.02022335 0.09697699 31.1437123 2.679195e-49
b 0.09789947 0.35161039  0.2784317 7.813342e-01
>
> summary(fit)$adj.r.squared
[1] 0.9122033

有关其他值,请参阅 help(summary.lm)。如果你还想看到作者 F 的系数,即

> fit$coefficients["authorF"]
  authorF 
0.6174314