假设我想用lm()
估计y
超过k组的平均值,其中组由一个因子定义。
如果我只运行lm(y ~ factor)
,这将给出一个截距,以及k-1因子的系数,但表示为与截距的差异。我想要有手段的直接价值。
有没有办法在contrast
中与lm()
干净利落地完成这项工作?我不确定这种对比会被称为...正交?我显然可以删除拦截:lm(y ~ -1+ factor)
但这会给我错误的R2值
reg1 <- lm(Sepal.Length~ Species, data= iris)
reg2 <- lm(Sepal.Length~ -1 + Species, data= iris)
## get coefs
coef(reg1) # not what I want
#> (Intercept) Speciesversicolor Speciesvirginica
#> 5.006 0.930 1.582
coef(reg2) # whay I want
#> Speciessetosa Speciesversicolor Speciesvirginica
#> 5.006 5.936 6.588
## THe models are equivalent:
all.equal(fitted(reg1), fitted(reg2))
#> [1] TRUE
# but the -1 trick will create problems for some stats, such as R2
summary(reg1)$r.squared
#> [1] 0.6187057
summary(reg2)$r.squared
#> [1] 0.9925426
由reprex package创建于2019-05-01(v0.2.1)
它不是“正交对比”,而是“完全没有对比”。
关于不正确的R平方:summary.lm
以不同的方式计算该数量,无论模型中是否有明确的截距。在这种情况下,您可能需要手动计算R平方:cor(Sepal.Length, fitted(reg2))^2
。见this comment。