簡體   English   中英

R |中的因子水平默認為1和2 虛擬變量

[英]Factor levels default to 1 and 2 in R | Dummy variable

我正在從Stata轉換到R.在Stata中,如果我將因子級別(比如-0和1)標記為(M和F),則0和1將保持不變。 此外,在大多數軟件(包括Excel和SPSS)中,這是虛擬變量線性回歸所必需的。

但是,我注意到R默認因子水平為1,2而不是0,1。 我不知道為什么R會這樣做,盡管內部(並且正確地)回歸假定0和1作為因子變量。 我將不勝感激任何幫助。

這是我做的:

嘗試#1:

sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(1,0),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 2 1 2 1 1

似乎因子水平現在重置為1和2.我相信1和2是這里對因子水平的引用。 但是,我丟失了原始值,即0和1。

Try2:

sex<-c(0,1,0,1,1)
sex<-factor(sex,levels = c(0,1),labels = c("F","M"))
str(sex)
Factor w/ 2 levels "F","M": 1 2 1 2 2

同上。 我的0和1現在是1和2。 非常令人驚訝。 為什么會這樣呢?

Try3現在,我想知道1和2是否有任何不良影響回歸。 所以,這就是我做的:

這是我的數據:

> head(data.frame(sassign$total_,sassign$gender))
  sassign.total_ sassign.gender
1            357              M
2            138              M
3            172              F
4            272              F
5            149              F
6            113              F

myfit<-lm(sassign$total_ ~ sassign$gender)

myfit$coefficients
    (Intercept) sassign$genderM 
      200.63522        23.00606  

事實證明,手段是正確的。 在運行回歸時,R確實使用0和1值作為假人。

我確實在SO上檢查了其他線程,但是他們主要討論R代碼如何在不告訴我原因的情況下對變量進 Stata和SPSS通常要求基變量為“0”。 所以,我想到了這個問題。

我很感激任何想法。

R不是Stata。 而且你需要忘掉很多關於虛擬變量構造的教學內容。 R為你做幕后工作。 你不能使R的行為與Stata完全相同。 是的,R在模型矩陣列中的“F”級別確實有0和1',但是這些乘以因子值(在這種情況下為1和2)。 然而,對比總是關於差異,差異btwn(0,1)與差異btwn(1,2)相同。

一個數據示例:

dput(dat)
structure(list(total = c(357L, 138L, 172L, 272L, 149L, 113L), 
    gender = structure(c(2L, 2L, 1L, 1L, 1L, 1L), .Label = c("F", 
    "M"), class = "factor")), .Names = c("total", "gender"), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")

這兩個回歸模型具有不同的模型矩陣(模型矩陣是R如何構造其“虛擬變量”。

> myfit<-lm(total ~ gender, dat)
> 
> myfit$coefficients
(Intercept)     genderM 
      176.5        71.0 
> dat$gender=factor(dat$gender, levels=c("M","F") )
> myfit<-lm(total ~ gender, dat)
> 
> myfit$coefficients
(Intercept)     genderF 
      247.5       -71.0 
> model.matrix(myfit)
  (Intercept) genderF
1           1       0
2           1       0
3           1       1
4           1       1
5           1       1
6           1       1
attr(,"assign")
[1] 0 1
attr(,"contrasts")
attr(,"contrasts")$gender
[1] "contr.treatment"

> dat$gender=factor(dat$gender, levels=c("F","M") )
> myfit<-lm(total ~ gender, dat)
> 
> myfit$coefficients
(Intercept)     genderM 
      176.5        71.0 
> model.matrix(myfit)
  (Intercept) genderM
1           1       1
2           1       1
3           1       0
4           1       0
5           1       0
6           1       0
attr(,"assign")
[1] 0 1
attr(,"contrasts")
attr(,"contrasts")$gender
[1] "contr.treatment"

簡而言之,您只是混合了兩個不同的概念。 我將在下面逐一澄清它們。


你在str()看到的整數的含義

你從str()看到的是因子變量的內部表示。 因子在內部是一個整數,其中數字給出了向量內的級別位置 例如:

x <- gl(3, 2, labels = letters[1:3])
#[1] a a b b c c
#Levels: a b c

storage.mode(x)  ## or `typeof(x)`
#[1] "integer"

str(x)
# Factor w/ 3 levels "a","b","c": 1 1 2 2 3 3

as.integer(x)
#[1] 1 1 2 2 3 3

levels(x)
#[1] "a" "b" "c"

這種位置的常見用法是以最有效的方式執行as.character(x)

levels(x)[x]
#[1] "a" "a" "b" "b" "c" "c"

你對模型矩陣看起來像什么的誤解

在我看來,你認為模型矩陣是通過

cbind(1L, as.integer(x))
#     [,1] [,2]
#[1,]    1    1
#[2,]    1    1
#[3,]    1    2
#[4,]    1    2
#[5,]    1    3
#[6,]    1    3

這不是真的。 以這種方式,您只是將因子變量視為數值變量。

模型矩陣以這種方式構造:

xlevels <- levels(x)
cbind(1L, match(x, xlevels[2], nomatch=0), match(x, xlevels[3], nomatch=0))
#     [,1] [,2] [,3]
#[1,]    1    0    0
#[2,]    1    0    0
#[3,]    1    1    0
#[4,]    1    1    0
#[5,]    1    0    1
#[6,]    1    0    1

10表示“匹配”/“發生”和“不匹配”/“不發生”。

R例程model.matrix將為您高效地執行此操作,具有易於讀取的列名稱和行名稱:

model.matrix(~x)
#  (Intercept) xb xc
#1           1  0  0
#2           1  0  0
#3           1  1  0
#4           1  1  0
#5           1  0  1
#6           1  0  1

寫一個R函數來自己生成一個模型矩陣

我們可以寫一個標稱例程mm來生成模型矩陣。 雖然它的效率遠低於model.matrix ,但它可以幫助人們更好地消化這個概念。

mm <- function (x, contrast = TRUE) {
  xlevels <- levels(x)
  lst <- lapply(xlevels, function (z) match(x, z, nomatch = 0L))
  if (contrast) do.call("cbind", c(list(1L), lst[-1]))
  else do.call("cbind", lst)
  }

例如,如果我們有一個因子y有5個級別:

set.seed(1); y <- factor(sample(1:5, 10, replace=TRUE), labels = letters[1:5])
y
# [1] b b c e b e e d d a
#Levels: a b c d e
str(y)
#Factor w/ 5 levels "a","b","c","d",..: 2 2 3 5 2 5 5 4 4 1

其有/無對比處理的模型矩陣分別為:

mm(y, TRUE)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    0    0    0
# [2,]    1    1    0    0    0
# [3,]    1    0    1    0    0
# [4,]    1    0    0    0    1
# [5,]    1    1    0    0    0
# [6,]    1    0    0    0    1
# [7,]    1    0    0    0    1
# [8,]    1    0    0    1    0
# [9,]    1    0    0    1    0
#[10,]    1    0    0    0    0

mm(y, FALSE)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    1    0    0    0
# [2,]    0    1    0    0    0
# [3,]    0    0    1    0    0
# [4,]    0    0    0    0    1
# [5,]    0    1    0    0    0
# [6,]    0    0    0    0    1
# [7,]    0    0    0    0    1
# [8,]    0    0    0    1    0
# [9,]    0    0    0    1    0
#[10,]    1    0    0    0    0

相應的model.matrix調用將分別為:

model.matrix(~ y)
model.matrix(~ y - 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM