簡體   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