什么时候可以删除线性回归模型中的截距?

机器算法验证 回归 线性模型 r平方 截距
2022-01-17 12:31:12

我正在运行线性回归模型,想知道删除截距项的条件是什么。

在比较两个不同回归的结果时,一个有截距,另一个没有,我注意到没有截距的函数的要高得多。我应该遵循某些条件或假设来确保删除截距项是有效的吗?R2

4个回答

最短答案:从不,除非您确定数据生成过程的线性近似(线性回归模型)由于某些理论或任何其他原因被迫通过原点如果不是,即使截距在统计上不显着,其他回归参数也会有偏差(奇怪但确实如此,例如,请参阅Brooks Introductory Econometrics)。最后,正如我经常向我的学生解释的那样,保留截距项可以确保残差项为零均值。

对于您的两个模型案例,我们需要更多上下文。线性模型可能不适合这里。例如,如果模型是乘法的,则需要先记录变换。由于过程呈指数增长,有时可能会发生会“高得多”。R2

筛选数据,使用 RESET 测试或任何其他线性规范测试来测试模型,这可能有助于查看我的猜测是否正确。而且,构建最高的模型是我真正关心的最后一个统计属性之一,但是很高兴向那些不太熟悉计量经济学的人展示(有很多肮脏的技巧可以使确定接近1 :))。R2

删除拦截是一个不同的模型,但有很多例子证明它是合法的。到目前为止的答案已经详细讨论了真实截距为 0 的示例。我将重点介绍一些我们可能对非典型模型参数化感兴趣的示例。

示例 1:ANOVA 样式模型。对于分类变量,我们通常创建编码组成员身份的二进制向量。标准回归模型被参数化为截距 + k - 1 个虚拟向量。截距编码“参考”组的期望值或省略的向量,其余向量测试每个组与参考之间的差异。但在某些情况下,获取每个组的期望值可能很有用。

dat <- mtcars
dat$vs <- factor(dat$vs)

## intercept model: vs coefficient becomes difference
lm(mpg ~ vs + hp, data = dat)

Coefficients:
(Intercept)          vs1           hp  
   26.96300      2.57622     -0.05453  

## no intercept: two vs coefficients, 
## conditional expectations for both groups
lm(mpg ~ 0 + vs + hp, data = dat)

Coefficients:
     vs0       vs1        hp  
26.96300  29.53922  -0.05453  

示例 2:标准化数据的情况。在某些情况下,可能会使用标准化数据。在这种情况下,截距设计为 0。我认为一个典型的例子是老式的结构方程模型或因子,它只在数据的协方差矩阵上运行。在下面的情况下,无论如何估计截距可能是一个好主意,如果只是为了降低额外的自由度(因为估计平均值,你真的应该失去它),但有少数情况下构造,均值可能为 0(例如,某些实验参与者分配评级,但被限制给出相同的正面和负面)。

dat <- as.data.frame(scale(mtcars))

## intercept is 0 by design
lm(mpg ~ hp + wt, data = dat)

Coefficients:
(Intercept)           hp           wt  
  3.813e-17   -3.615e-01   -6.296e-01  

## leaving the intercept out    
lm(mpg ~ 0 + hp + wt, data = dat)

Coefficients:
     hp       wt  
-0.3615  -0.6296  

示例 3:多元模型和隐藏截距。这个例子在很多方面与第一个例子相似。在这种情况下,数据已被堆叠,因此两个不同的变量现在位于一个长向量中。第二个变量编码有关响应向量 是否y属于mpg或的信息disp在这种情况下,要获得每个结果的单独截距,您可以抑制整体截距并包含两个虚拟向量以进行测量。这是一种多变量分析。通常不使用lm()因为你有重复的措施,应该允许不独立。但是,在一些有趣的情况下这是必要的。例如,当尝试使用随机效应进行中介分析时,要获得完整的方差协方差矩阵,您需要同时估计两个模型,这可以通过堆叠数据和巧妙地使用虚拟向量来完成。

## stack data for multivariate analysis
dat <- reshape(mtcars, varying = c(1, 3), v.names = "y",
  timevar = "measure", times = c("mpg", "disp"), 
             direction = "long")
dat$measure <- factor(dat$measure)

## two regressions with intercepts only
lm(cbind(mpg, disp) ~ 1, data = mtcars)

Coefficients:
             mpg     disp  
(Intercept)   20.09  230.72

## using the stacked data, measure is difference 
## between outcome means
lm(y ~ measure, data = dat)

Coefficients:
(Intercept)   measurempg  
      230.7       -210.6  

## separate 'intercept' for each outcome
lm(y ~ 0 + measure, data = dat)

Coefficients:
measuredisp   measurempg  
     230.72        20.09  

我并不是说拦截通常应该被删除,但灵活一点是好的。

这里有很好的答案。两件小事:

  1. 关于丢弃截距时更高的 ,您应该阅读@cardinal 的这个出色答案。(简而言之,当截距被强制为 0 时可能根本无法比较。) R2R2R2
  2. 有几个人指出,在丢弃截距之前,您应该确定截距必须为 0(出于理论上的原因),而不仅仅是它不“显着”。我认为这是对的,但这不是故事的全部。您还需要知道,真正的数据生成函数范围内一直是完全线性的,一直到 0。请记住,该函数在您的数据中总是可能近似线性的,但实际上略微弯曲。将函数视为在您的观察范围内是线性的可能是非常合理的,即使它不是完全如此,但如果它不是X即使真正的截距是 0

无论您是否有可能看到所有值为零的解释变量,您都不应该放弃截距。

如果您删除截距,那么其他估计都会有偏差。即使截距的真实值大约为零(这是您可以从数据中得出的全部结论),如果您将斜率强制为零,那么您就是在搞乱斜率

除非-您正在使用非常清晰且明显的物理模型来测量某些东西,该物理模型要求截距为零(例如,您将矩形棱柱的高度、宽度和长度作为解释变量,而响应变量是带有一些测量误差的体积)。如果你的响应变量是房子的价值,你肯定需要留下拦截。