鉴于我有三个分类变量(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
函数返回以下
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
这是所谓的&#34;效果模型&#34;拦截实际上是整体效果,而X [,2]是变量的影响。
实际上这两个例子是不同的,但我不明白为什么lm函数给出不同格式的模型因此拦截的不同含义?
答案 0 :(得分:1)
产生差异是因为第二个模型使用另一个(错误的)数据类型。
在你的第一个模型中,你有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
通常这种标准行为是正确的,但无论如何你可以通过使用“对比”来确切知道它应该如何编码你的变量。如果您有兴趣,This article会提供一个很好的概述。