欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

R語言實(shí)現(xiàn)將分類變量轉(zhuǎn)換為啞變量(dummy vairable)

 更新時(shí)間:2021年04月17日 09:24:12   作者:jasonxty  
這篇文章主要介紹了R語言實(shí)現(xiàn)將分類變量轉(zhuǎn)換為啞變量(dummy vairable),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

生成測試數(shù)據(jù)

a1 <- c(“f”,”f”,”b”,”b”,”c,”c”)

利用nnet包中的函數(shù)class.ind

> class.ind(a1)
b c f
[1,] 0 0 1
[2,] 0 0 1
[3,] 1 0 0
[4,] 1 0 0
[5,] 0 1 0
[6,] 0 1 0

class.ind代碼

class.ind <- function(cl) {
  n <- length(cl)
  cl <- as.factor(cl)
  x <- matrix( 0,  n ,  length(levels(cl)) )
  # unclass 返回每個(gè)字符在level表中的位置
  # 然后按照列計(jì)算在向量中的位置
  x[n*(unclass(cl)-1) + (1:n)] <- 1
  dimnames(x) <- list(names(cl), levels(cl))
  x
}

補(bǔ)充:R語言中啞變量的設(shè)置

在構(gòu)建回歸模型時(shí),如果自變量X為連續(xù)性變量,回歸系數(shù)β可以解釋為:在其他自變量不變的條件下,X每改變一個(gè)單位,所引起的因變量Y的平均變化量;如果自變量X為二分類變量,例如是否飲酒(1=是,0=否),則回歸系數(shù)β可以解釋為:其他自變量不變的條件下,X=1(飲酒者)與X=0(不飲酒者)相比,所引起的因變量Y的平均變化量。

但是,當(dāng)自變量X為多分類變量時(shí),例如職業(yè)、學(xué)歷、血型、疾病嚴(yán)重程度等等,此時(shí)僅用一個(gè)回歸系數(shù)來解釋多分類變量之間的變化關(guān)系,及其對(duì)因變量的影響,就顯得太不理想。

此時(shí),我們通常會(huì)將原始的多分類變量轉(zhuǎn)化為啞變量,每個(gè)啞變量只代表某兩個(gè)級(jí)別或若干個(gè)級(jí)別間的差異,通過構(gòu)建回歸模型,每一個(gè)啞變量都能得出一個(gè)估計(jì)的回歸系數(shù),從而使得回歸的結(jié)果更易于解釋,更具有實(shí)際意義。

啞變量(Dummy Variable),又稱為虛擬變量、虛設(shè)變量或名義變量,從名稱上看就知道,它是人為虛設(shè)的變量,通常取值為0或1,來反映某個(gè)變量的不同屬性。對(duì)于有n個(gè)分類屬性的自變量,通常需要選取1個(gè)分類作為參照,因此可以產(chǎn)生n-1個(gè)啞變量。

什么情況下需要設(shè)置啞變量

1. 對(duì)于無序多分類變量,引入模型時(shí)需要轉(zhuǎn)化為啞變量

舉一個(gè)例子,如血型,一般分為A、B、O、AB四個(gè)類型,為無序多分類變量,通常情況下在錄入數(shù)據(jù)的時(shí)候,為了使數(shù)據(jù)量化,我們常會(huì)將其賦值為1、2、3、4。

從數(shù)字的角度來看,賦值為1、2、3、4后,它們是具有從小到大一定的順序關(guān)系的,而實(shí)際上,四種血型之間并沒有這種大小關(guān)系存在,它們之間應(yīng)該是相互平等獨(dú)立的關(guān)系。如果按照1、2、3、4賦值并帶入到回歸模型中是不合理的,此時(shí)我們就需要將其轉(zhuǎn)化為啞變量。

2. 對(duì)于有序多分類變量,引入模型時(shí)需要酌情考慮

例如疾病的嚴(yán)重程度,一般分為輕、中、重度,可認(rèn)為是有序多分類變量,通常情況下我們也常會(huì)將其賦值為1、2、3(等距)或1、2、4(等比)等形式,通過由小到大的數(shù)字關(guān)系,來體現(xiàn)疾病嚴(yán)重程度之間一定的等級(jí)關(guān)系。

但需要注意的是,一旦賦值為上述等距或等比的數(shù)值形式,這在某種程度上是認(rèn)為疾病的嚴(yán)重程度也呈現(xiàn)類似的等距或等比的關(guān)系。而事實(shí)上由于疾病在臨床上的復(fù)雜性,不同的嚴(yán)重程度之間并非是嚴(yán)格的等距或等比關(guān)系,因此再賦值為上述形式就顯得不太合理,此時(shí)可以將其轉(zhuǎn)化為啞變量進(jìn)行量化。

3. 對(duì)于連續(xù)性變量,進(jìn)行變量轉(zhuǎn)化時(shí)可以考慮設(shè)定為啞變量

對(duì)于連續(xù)性變量,很多人認(rèn)為可以直接將其帶入到回歸模型中即可,但有時(shí)我們還需要結(jié)合實(shí)際的臨床意義,對(duì)連續(xù)性變量作適當(dāng)?shù)霓D(zhuǎn)換。例如年齡,以連續(xù)性變量帶入模型時(shí),其解釋為年齡每增加一歲時(shí)對(duì)于因變量的影響。但往往年齡增加一歲,其效應(yīng)是很微弱的,并沒有太大的實(shí)際意義。

此時(shí),我們可以將年齡這個(gè)連續(xù)性變量進(jìn)行離散化,按照10歲一個(gè)年齡段進(jìn)行劃分,如0-10、11-20、21-30、31-40等等,將每一組賦值為1、2、3、4,此時(shí)構(gòu)建模型的回歸系數(shù)就可以解釋為年齡每增加10歲時(shí)對(duì)因變量的影響。

以上賦值方式是基于一個(gè)前提,即年齡與因變量之間存在著一定的線性關(guān)系。但有時(shí)候可能會(huì)出現(xiàn)以下情況,例如在年齡段較低和較高的人群中,某種疾病的死亡率較高,而在中青年人群中,死亡率卻相對(duì)較低,年齡和死亡結(jié)局之間呈現(xiàn)一個(gè)U字型的關(guān)系,此時(shí)再將年齡段賦值為1、2、3、4就顯得不太合理了。

因此,當(dāng)我們無法確定自變量和因變量之間的變化關(guān)系,將連續(xù)性自變量離散化時(shí),可以考慮進(jìn)行啞變量轉(zhuǎn)換。

還有一種情況,例如將BMI按照臨床診斷標(biāo)準(zhǔn)分為體重過低、正常體重、超重、肥胖等幾種分類時(shí),由于不同分類之間劃分的切點(diǎn)是不等距的,此時(shí)賦值為1、2、3就不太符合實(shí)際情況,也可以考慮將其轉(zhuǎn)化為啞變量。

在設(shè)定啞變量時(shí),應(yīng)該選擇哪一類作為參照呢?

1. 一般情況下,可以選擇有特定意義的,或者有一定順序水平的類別作為參照

例如,婚姻狀態(tài)分為未婚、已婚、離異、喪偶等情況,可以將“未婚”作為參照;或者如學(xué)歷,分為小學(xué)、中學(xué)、大學(xué)、研究生等類別,存在著一定的順序,可以將“小學(xué)”作為參照,以便于回歸系數(shù)更容易解釋。

2. 可以選擇臨床正常水平作為參照

例如,BMI按照臨床診斷標(biāo)準(zhǔn)分為體重過低、正常體重、超重、肥胖等類別,此時(shí)可以選擇“正常體重”作為參照,其他分類都與正常體重進(jìn)行比較,更具有臨床實(shí)際意義。

3. 還可以將研究者所關(guān)注的重點(diǎn)類別作為參照

例如血型,分為A、B、O、AB四個(gè)類型,研究者更關(guān)注O型血的人,因此可以將O型作為參照,來分析其他血型與O型相比后對(duì)于結(jié)局產(chǎn)生影響的差異。

4. R語言中實(shí)現(xiàn)

在R語言中對(duì)包括分類變量(factor)的數(shù)據(jù)建模時(shí),一般會(huì)將其自動(dòng)處理為虛擬變量或啞變量(dummy variable)。但有一些特殊的函數(shù),如neuralnet包中的neuralnet函數(shù)就不會(huì)預(yù)處理。如果直接將原始數(shù)據(jù)扔進(jìn)去,會(huì)出現(xiàn)”requires numeric/complex matrix/vector arguments”需要數(shù)值/復(fù)數(shù)矩陣/矢量參數(shù)錯(cuò)誤。

這個(gè)時(shí)候,除了將這些變量刪除,我們只能手動(dòng)將factor variable轉(zhuǎn)換為取值(0,1)的虛擬變量。所用的函數(shù)一般有model.matrix(),nnet package中的class.ind()

下面以UCI的german credit data為例說明。

首先,從UCI網(wǎng)站上下載到german.data數(shù)據(jù)集,并用str函數(shù)對(duì)其有個(gè)簡單的認(rèn)識(shí)。

download.file("http://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data", "./german.data")
data <- read.table("./german.data")
str(data)

該數(shù)據(jù)有21個(gè)變量,其中V21為目標(biāo)變量,V1-V20中包括integer和factor兩種類型。下面將用V1分類變量(包含4個(gè)level)和V2,V5,V8三個(gè)數(shù)值型變量作為解釋變量建模。

## 'data.frame':    1000 obs. of  21 variables:
##  $ V1 : Factor w/ 4 levels "A11","A12","A13",..: 1 2 4 1 1 4 4 2 4 2 ...
##  $ V2 : int  6 48 12 42 24 36 24 36 12 30 ...
##  $ V3 : Factor w/ 5 levels "A30","A31","A32",..: 5 3 5 3 4 3 3 3 3 5 ...
##  $ V4 : Factor w/ 10 levels "A40","A41","A410",..: 5 5 8 4 1 8 4 2 5 1 ...
##  $ V5 : int  1169 5951 2096 7882 4870 9055 2835 6948 3059 5234 ...
##  $ V6 : Factor w/ 5 levels "A61","A62","A63",..: 5 1 1 1 1 5 3 1 4 1 ...
##  $ V7 : Factor w/ 5 levels "A71","A72","A73",..: 5 3 4 4 3 3 5 3 4 1 ...
##  $ V8 : int  4 2 2 2 3 2 3 2 2 4 ...
##  $ V9 : Factor w/ 4 levels "A91","A92","A93",..: 3 2 3 3 3 3 3 3 1 4 ...
##  $ V10: Factor w/ 3 levels "A101","A102",..: 1 1 1 3 1 1 1 1 1 1 ...
##  $ V11: int  4 2 3 4 4 4 4 2 4 2 ...
##  $ V12: Factor w/ 4 levels "A121","A122",..: 1 1 1 2 4 4 2 3 1 3 ...
##  $ V13: int  67 22 49 45 53 35 53 35 61 28 ...
##  $ V14: Factor w/ 3 levels "A141","A142",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ V15: Factor w/ 3 levels "A151","A152",..: 2 2 2 3 3 3 2 1 2 2 ...
##  $ V16: int  2 1 1 1 2 1 1 1 1 2 ...
##  $ V17: Factor w/ 4 levels "A171","A172",..: 3 3 2 3 3 2 3 4 2 4 ...
##  $ V18: int  1 1 2 2 2 2 1 1 1 1 ...
##  $ V19: Factor w/ 2 levels "A191","A192": 2 1 1 1 1 2 1 2 1 1 ...
##  $ V20: Factor w/ 2 levels "A201","A202": 1 1 1 1 1 1 1 1 1 1 ...
##  $ V21: int  1 2 1 1 2 1 1 1 1 2……

首先加載neuralnet包嘗試一下,只用數(shù)值型變量建模,沒有報(bào)錯(cuò)。

library("neuralnet")
NNModelAllNum <- neuralnet(V21 ~ V2 + V5 + V8, data)
NNModelAllNum

當(dāng)我們把V1放入解釋變量中出現(xiàn)了如下錯(cuò)誤

NNModel <- neuralnet(V21 ~ V1 + V2 + V5 + V8, data)
## Error: 需要數(shù)值/復(fù)數(shù)矩陣/矢量參數(shù)

此時(shí)可以用model.matrix函數(shù)將V1轉(zhuǎn)化為三個(gè)虛擬變量,V1A12,V1A13,V1A14。

>dummyV1 <- model.matrix(~V1, data)
>head(cbind(dummyV1, data$V1))
   (Intercept) V1A12 V1A13 V1A14  
 1           1     0     0     0 1
 2           1     1     0     0 2
 3           1     0     0     1 4
 4           1     0     0     0 1
 5           1     0     0     0 1
 6           1     0     0     1 4

因?yàn)閙odel.matrix函數(shù)對(duì)數(shù)值型和分類Level=2的類別型變量沒有影響,所以可以將四個(gè)變量一起用該函數(shù)生成新的數(shù)據(jù)集modelData,就可以用該數(shù)據(jù)集建模了。

>modelData <- model.matrix(~V1 + V2 + V5 + V8 + V21, data)
>head(modelData)
   (Intercept) V1A12 V1A13 V1A14 V2   V5 V8 V21
 1           1     0     0     0  6 1169  4   1
 2           1     1     0     0 48 5951  2   2
 3           1     0     0     1 12 2096  2   1
 4           1     0     0     0 42 7882  2   1
 5           1     0     0     0 24 4870  3   2
 6           1     0     0     1 36 9055  2   1

另一種方法是來自nnet package的class.ind函數(shù)

>library("nnet")
>dummyV12 <- class.ind(data$V1)
>head(dummyV12)
      A11 A12 A13 A14
 [1,]   1   0   0   0
 [2,]   0   1   0   0
 [3,]   0   0   0   1
 [4,]   1   0   0   0
 [5,]   1   0   0   0
 [6,]   0   0   0   1

可以看到,該結(jié)果和model.matrix稍有區(qū)別,生成了四個(gè)虛擬變量。要注意,為了避免多重共線性,對(duì)于level=n的分類變量只需選取其任意n-1個(gè)虛擬變量。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • R語言是什么 R語言簡介

    R語言是什么 R語言簡介

    R是用于統(tǒng)計(jì)分析、繪圖的語言和操作環(huán)境。R是屬于GNU系統(tǒng)的一個(gè)自由、免費(fèi)、開源的軟件,它是一個(gè)用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖的優(yōu)秀工具
    2021-03-03
  • R語言變量重編碼、重命名的操作

    R語言變量重編碼、重命名的操作

    這篇文章主要介紹了R語言變量重編碼、重命名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R包c(diǎn)lusterProfiler如何安裝成功(新手必看!)

    R包c(diǎn)lusterProfiler如何安裝成功(新手必看!)

    最近在我以為ClusterProfiler已經(jīng)安裝好的時(shí)候,又遇到了一些問題,所以這篇文章主要給大家介紹了關(guān)于R包c(diǎn)lusterProfiler如何安裝成功的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • R語言數(shù)據(jù)結(jié)構(gòu)之矩陣、數(shù)組與數(shù)據(jù)框詳解

    R語言數(shù)據(jù)結(jié)構(gòu)之矩陣、數(shù)組與數(shù)據(jù)框詳解

    進(jìn)行數(shù)據(jù)分析的第一步是先拿到數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于R語言數(shù)據(jù)結(jié)構(gòu)之矩陣、數(shù)組與數(shù)據(jù)框的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • R語言繪制坐標(biāo) 保存圖片的操作

    R語言繪制坐標(biāo) 保存圖片的操作

    這篇文章主要介紹了R語言繪制坐標(biāo) 保存圖片的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言ggplot2包之坐標(biāo)軸詳解

    R語言ggplot2包之坐標(biāo)軸詳解

    這篇文章主要介紹了R語言ggplot2包之坐標(biāo)軸詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言列篩選的方法select實(shí)例詳解

    R語言列篩選的方法select實(shí)例詳解

    對(duì)于大數(shù)據(jù),linux和python是很好的處理工具,但是對(duì)于這兩個(gè)語言不熟悉的盆友來說,R語言是非常好的替代工具,下面這篇文章主要給大家介紹了關(guān)于R語言列篩選的法select的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • R語言利用caret包比較ROC曲線的操作

    R語言利用caret包比較ROC曲線的操作

    這篇文章主要介紹了R語言利用caret包比較ROC曲線的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • R語言關(guān)于“包”的知識(shí)點(diǎn)總結(jié)

    R語言關(guān)于“包”的知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是一篇關(guān)于R語言“包”的知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • R語言-解決處理矩陣遇到內(nèi)存不足的問題

    R語言-解決處理矩陣遇到內(nèi)存不足的問題

    這篇文章主要介紹了R語言-解決處理矩陣遇到內(nèi)存不足的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評(píng)論