截距的含义不同?
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 提供了很好的概述。
假设我有三个分类变量 (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 提供了很好的概述。