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

发布于 2025-01-13 10:17:38 字数 339 浏览 0 评论 0原文

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

我想使用 lm 并预测看不见的数据。

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

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

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

I am working on panel regression and decided to switch to lm(), because plm() does not have a good predict() function for test data (as well as linearmodels in Python) and lme4 syntax is not intuitive for me as a newbie to econometrics.

I want to use lm and predict on unseen data.

My lm() equation looks like this with author as a fixed effect

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

Obviously it prints me thousands of individual coefficients. How to construct a model in lm(), evaluating for all authors without printing individually?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明月夜 2025-01-20 10:17:38

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

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 排除在外,而不是固定效果回归为每个作者计算效果。没有遗漏任何基础水平。

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

您可以像这样仅打印 ab 的系数

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

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

> 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 

Let's assume some concrete data example, e.g.

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))

Now we do a fixed effect regression, I assume we do not want any Intercept so the command is

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

The - 1 part in the formula leaves the Intercpet out, instead a fixed effect is computed for each author. No base level left out.

Printing this model or it's summary is feasible with the 10 authors in the example but not with thousands in your work.

You can print the coefficents of only a and b like this

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

You can see the coefficients and their p-values via the anova command

> 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 

And you can even deconstruct summary(fit) for the coefficents or to display the adjusted 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

For other values see help(summary.lm). Should you still want to see the coefficient of author F that is

> fit$coefficients["authorF"]
  authorF 
0.6174314 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文