[英]R model.matrix and the tilde operator usage?
我在搞乱 R 并遇到了一些使用波浪号运算符和 Model.Matrix 的代码,我不太明白。 我在下面制作了一个非常简单的示例。
rm(list=ls())
data("iris")
x = model.matrix(~Species +0, iris)
x
这是选择具有不同物种的 3 个随机行的数据的快速快照:
>iris[c(1,78, 143),]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
78 6.7 3.0 5.0 1.7 versicolor
143 5.8 2.7 5.1 1.9 virginica
并且在同一行,但在通过 model.matrix 之后:
> x[c(1,78,143),]
Speciessetosa Speciesversicolor Speciesvirginica
1 1 0 0
78 0 1 0
143 0 0 1
如您所见,此 output output 创建了一个 3 列和 150 行的矩阵(相同数量的观察值)。 在每一行中,相应的花种都标记为 1。这真的很整洁,但我无法真正理解它是如何或为什么会准确工作的。
我对两个要素感到困惑。
model.matrix creates a design (or model) matrix, eg, by expanding factors to a set of dummy variables (depending on the contrasts) and expanding interactions similarly.
我不太明白这意味着什么。 当它对一组虚拟变量说“扩展因子”时是什么意思?
lm(Y ~ X1+X2-X3)
等。 我从来没有见过它在这里赤身裸体地使用。如果我只是在控制台中运行类似的东西而不像这样包装 model.matrix :
> ~iris$Species
我只得到这个 output:
~iris$Species
老实说,这似乎是一个错误,但我认为因为 R 并没有告诉我它实际上不是一个错误。
这里有很多,让我们逐点介绍go。 主要思想是model.matrix()
旨在将数据集中的变量转换为适合线性回归的矩阵格式(您可能熟悉回归的线性代数表达式, y = X %*% beta
)。
对于简单的数值协变量,转换很简单——变量变成X
中的一列。 然而,分类变量(R 中的因子)必须转换为一组二元变量,这些变量将代表跨类别的预期响应差异,其方式由与因子相关的对比定义。
~Species +0
表示为Species
因子设置虚拟变量: +0
表示不使用截距。 在这种特殊情况下,创建的虚拟变量是指示变量——对于给定的行,与该观察的物种对应的列中的值为 1,其他为 0。因为(例如)第一个观察是“Setosa ", Speciessetosa
为 1,其他列为零。 如果您有一个包含每个物种平均值的系数向量 ( beta
),则乘以这个X %*% beta
将挑选出与每个观察的物种相对应的平均值。
(R 公式语言是一个相当大的兔子洞:如果公式包含具有不同对比的因子;交互作用;或poly()
或splines::ns()
等函数,它可以从单个输入变量...)
问题 2:在<response> ~ <stuff>
中, <stuff>
包含我们需要定义 model 矩阵的输入变量。 在我们实际拟合回归 model 之前,我们不需要知道响应变量,因此我们可以使用单边公式~ <stuff>
。
您的最后一个问题:在公式上下文之外使用~
告诉 R 将波浪号后面的任何内容保留为未评估的表达式。 例如:
> x <- ~hello
> x
~hello
> x[[2]]
hello
> hello <- 5
> eval(x[[2]])
[1] 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.