为什么要使用model.matrix来构建设计?

时间:2017-05-24 20:40:37

标签: r

我对我们有时对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

1 个答案:

答案 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是一种潜在有用的抽象,它大大简化了研究人员和开发人员的生活。希望它有所帮助。