截距的含义不同?

Different intercept’s meaning?

假设我有三个分类变量 (x1,x2,x3),每个变量有两个水平。

x1 <- as.factor(c(rep(1,5), rep(2,5)))
x2 <- sample(x1)
x3 <- sample(x1)
y <- rnorm (10, 3,3)
res1 <- lm ( y~ x1+x2+x3)
summary(res1)

那么lm函数呢returns下面

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)    3.658      1.869   1.957   0.0981 .
x12            3.071      2.786   1.102   0.3127  
x22            1.275      2.275   0.560   0.5956  
x32           -2.818      2.786  -1.011   0.3510  

所以我的模型看起来像 y=b0+b1*x1+b2*x2+b3*x3

另一方面,当我 运行 进行此分析时(同样是两个水平的三个分类变量)

X <- melt(cbind(x1,x2,x3))[,-1]
Y <- rnorm (30, 3,3)
res2 <- lm ( Y~X[,2])
summary(res2)

结果是:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)   3.0171     1.7845   1.691    0.102
X[, 2]       -0.2308     1.1286  -0.204    0.839

这里就是所谓的"effects model",其中截距实际上是整体效果,X[ 2]是变量的效果。

确实这两个例子是不同的,但是我不明白为什么lm函数给出了不同的模型格式因此拦截的不同含义

出现差异是因为第二个模型使用了另一种(错误的)数据类型。

在您的第一个模型中,您有 3 个预测因子,每个因子具有 2 个水平。数据类型 factor 告诉 R 这些是分类变量,因此 R 假设您对不同级别的不同均值感兴趣。

在您的第二个模型中,您只有一个预测变量 X[, 2],它是一个法向量(双精度),不再是 factor。 R 不知道这个预测变量只有两个水平,并假定它是一个连续变量。这样你就得到了一个有截距和斜率的模型。

如果您再次明确地将 X[, 2] 转换为一个因数,一切都会成功:

res3 <- lm ( Y~factor(X[, 2]))
summary(res3)


Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)       3.1515     0.7403   4.257  0.00021 ***
factor(X[, 2])2  -0.5892     1.0469  -0.563  0.57808   

通常这种标准行为是正确的,但无论如何您可以使用 "contrasts" 准确地告诉 R 它应该如何编码您的变量。如果您有兴趣,This article 提供了很好的概述。