繁体   English   中英

R model.matrix 和波浪号运算符的用法?

[英]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。这真的很整洁,但我无法真正理解它是如何或为什么会准确工作的。

我对两个要素感到困惑。

  1. model.matrix 到底在做什么。 当我在 RStudio 中调出帮助菜单时,它只是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.

我不太明白这意味着什么。 当它对一组虚拟变量说“扩展因子”时是什么意思?

  1. 另外,这里如何使用波浪号运算符? 通常,当我看到波浪号运算符时,它将 Y 和 Xs 分开,如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM