天天看點

r語言dmy()函數轉化出現na_R語言進階之判别分析

R語言的“MASS“包是一個十分強大的統計包,可以進行各種統計分析,我也将圍繞它來介紹判别分析。”MASS“包既可以進行線性判别,也可以進行二次判别。除非

指定先驗機率

,否則”MASS”的判别分析會按照樣本量來等比例給出先驗機率。

這裡我們使用的還是鸢尾花資料集,将“setosa”編号為0,“versicolor”編号為1,“virginica”編号為2。

1. 線性判别函數

# 使用Jacknifed預測進行線性判别分析
library(MASS) # 加載R包
mydata <- iris # 将iris命名成mydata以便後續操作
mydata$type[which(mydata$Species=="setosa")] <- 0 # 設定setosa為0
mydata$type[which(mydata$Species=="versicolor")] <- 1 # 設定versicolor為1
mydata$type[which(mydata$Species=="virginica")] <- 2 # 設定virginica為2
attach(mydata) # 固定資料框
fit <- lda(type~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, data=mydata,na.action="na.omit") # 拟合判别模型,忽視缺失值
fit # 展示拟合結果
           
r語言dmy()函數轉化出現na_R語言進階之判别分析

注意一下,上面的函數lda()其實就是線性判别分析函數(linear discriminant analysis),當指定na.action="na.omit"就相當于删除含有缺失值的樣本。

注意

:lda()函數并不提供顯著性檢驗,如果想進行顯著性檢驗,可以使用manova()函數。

2. 二次判别函數

在“MASS”包裡我們可以使用qda()函數來進行二次判别分析,這裡qda實際上就是二次判别分析(quadratic discriminant analysis)的英文縮寫。二次判别分析的前提條件比較寬松,不像線性判别那樣要求同方差。同樣地,我們仍然使用之間建立好的mydata資料框來進行二次判别分析。

# 三組類别的二次判别分析 
# 假定各組的先驗機率相等,均為1/3
library(MASS) # 加載R包
fit2 <- qda(type ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,data=na.omit(mydata),prior=c(1,1,1)/3) # prior用于指定先驗機率,na.omit()去除缺失值
           
3. 結果可視化

你可以使用簡單的plot()函數來可視化判别分析的結果(R語言入門之基本繪圖),這裡的橫縱坐标分别代表前兩個線性判别函數,每個觀察點可以通過組别來區分。

# 使用前兩個線性判别函數繪制散點圖
plot(fit) # 用lda的拟合結果繪圖
           
r語言dmy()函數轉化出現na_R語言進階之判别分析

從上圖我們可以看出0類和其它兩類區分很明顯,但是1和2的區分并不是非常完美,說明1和2這兩類可能會有出錯的可能。

接下來的代碼根據第一線性判别函數繪制的每一類的柱狀圖和機率密度曲線:

# 就第一線性判别函數繪制各類的柱狀圖和機率密度曲線
plot(fit, dimen=1, type="both") # 使用lda的拟合結果
           
r語言dmy()函數轉化出現na_R語言進階之判别分析

從上圖我們可以看出,0組和其它兩個組在X軸上沒有重疊部分,但是1和2是由部分重疊的,說明0組和其它兩組很容易分開,但是1和2組并不容易區分。這和散點圖看出來的結果是一緻的。

4. 假設條件的檢驗

在進行判别分析時,我們必須牢記:當資料是

同方差時

,我們可以使用線性判别函數;如果各組資料

異方差

,則使用二次判别函數更為準确。關于多中繼資料的異方差檢驗可以使用manova()函數。

關于判别分析的内容就講到這裡,咱們下期再見!

繼續閱讀