我对我们有时对model.matrix的使用感到有些困惑。我明白这是为了建立一个设计矩阵(https://en.wikipedia.org/wiki/Design_matrix),但为什么我们不坚持将列直接传递给glm?
我已经建立了一个小例子来试图找到任何差异,但两者看起来都是等价的。谁能解释一下?
谢谢!
## Data prep
require(data.table)
require(ggplot2)
set.seed(200)
s = 204
dt = data.table(x1=seq(1,s),
x2=c(-3,0,3,9),
switch = c("Low","Zero","High","VHigh"),
e = rnorm(s,mean =0, sd=5))
dt[, y_real := x1^2+x2*e]
# Regression without explicit design matrix
r = lm(y_real~I(x1^2)+switch,data=dt)
summary(r)
dt[, y_fitted := r$fitted.values]
# Regression with explicit design matrix
mod = model.matrix(~I(x1^2)+switch+0, data=dt)
r2 = lm(dt$y_real~mod)
summary(r2)
dt[, y_model := r2$fitted.values]
identical(dt$y_fitted, dt$y_model) # => FALSE, but errors ~ 1e-14
ggplot(dt[1:20])+
aes(x=x1)+
geom_line(aes(y = y_real, colour = "Y real"))+
geom_point(aes(y = y_fitted, colour = "Y fitted"))+
geom_line(aes(y = y_model, colour = "Y model"))
# => perfectly aligned
答案 0 :(得分:1)
当你这样使用时,它们彼此相同。从回归公式和数据中,您可以得到一个model.matrix,而model.matrix的每一列都只是根据公式变换的原始变量版本,这就是获取回归参数所需的一切。
从我自己的角度来看,我认为model.matrix只是公式世界(我们用它来描述统计模型)和glm和lm以及其他统计方法实际依赖的数值方法之间的桥梁。从用户角度来看,你只需要知道你有一些公式,并且你有一些数据,那么你可以使用lm或glm来获得你想要的结果,这非常简单,而且你不需要关心model.matrix。从实际实现的角度来看,您可以从公式和数据中获取model.matrix,然后继续使用一些数值方法来获得所需的结果。
虽然大多数用户不需要关心model.matrix,但有些用户可能会关心它。也许他们想对设计矩阵做一些分析?也许他们扩展了公式类,他们想要他们新的"公式" class生成model.matrix然后可以直接用于glm或lm吗?或者他们在矩阵(model.matrix)上开发了一些新的回归方法,他们可以使他们的回归方法易于使用公式和data.frame,这对一般用户更有吸引力?
在我个人看来,model.matrix是一种潜在有用的抽象,它大大简化了研究人员和开发人员的生活。希望它有所帮助。