應用統計學與R語言實現筆記(番外篇三)——缺失值的相關係數分析

昨天剛好有位同學來諮詢R語言裏計算相關係數的一些問題,所以來談談關於缺失值的相關係數分析問題,主要是在R語言中如何處理含缺失值數據的相關係數分析。

1 問題描述

相關分析可以說是數據分析以及探索性分析的基礎。一般拿到手的數據,起手先來一波相關分析。同學遇上的問題如下:類似如下的數據。這裏的數據是我利用隨機分佈隨機造出來的,跟我同學的數據的一些基礎分佈特徵是相似的。其實關鍵就是第四列數據有缺失數據。

然後在計算具體的相關係數時發現了一些問題。

可以清楚地看到在只計算b和c的相關係數的情況下,相關係數與p值分別爲0.24和0.13,但當b,c和d都參與運算的情況下,相關係數和p值就變成了0.19和0.24。造成差別的原因是什麼呢?

2 R語言相關分析中的缺失值處理原理

經過檢查,關鍵在於use的參數的選擇。use可以設置的參數主要包括pairwise,complete,complete.obs,pairwise.complete.obs,everything等。這裏分別來看具體的含義。事實上這些都是針對相關係數公式裏的協方差計算的設置。

  • pairwise:使用成對樣本計算。
  • complete/complete.obs:必須選擇完整的樣本計算,目前沒發現這兩個有什麼區別。
  • pairwise.complete.obs:通過在成對的基礎上省略具有缺失值的行而形成的向量爲每對列計算相關性。
  • everything:不對缺失值做任何處理,因此缺失值結果會直接傳遞給相關係數矩陣與p值計算。也就是說含有缺失值NA的變量無法計算出相關係數與p值。

由於前面提到這是針對協方差的計算,所以可以再查看R裏面計算協方差的函數——cov的幫助文檔協助理解。這是原文。

If use is “everything”, NAs will propagate conceptually, i.e., a resulting value will be NA whenever one of its contributing observations is NA. If use is “all.obs”, then the presence of missing observations will produce an error. If use is “complete.obs” then missing values are handled by casewise deletion (and if there are no complete cases, that gives an error). “na.or.complete” is the same unless there are no complete cases, that gives NA. Finally, if use has the value “pairwise.complete.obs” then the correlation or covariance between each pair of variables is computed using all complete pairs of observations on those variables. This can result in covariance or correlation matrices which are not positive semi-definite, as well as NA entries if there are no complete pairs for that pair of variables. For cov and var, “pairwise.complete.obs” only works with the “pearson” method. Note that (the equivalent of) var(double(0), use = *) gives NA for use = “everything” and “na.or.complete”, and gives an error in the other cases.

整體說起來還是比較抽象。往下我們可以通過一些簡單的R語言計算來進行協助理解。當然這個案例並非我獨創,我在谷歌上做了相關搜索,發現了一個關於描述這個相關係數計算處理缺失值非常不錯的網頁。我相當於是翻譯+搬運工。

3 “Pairwise-complete correlation considered dangerous”案例

網頁標題爲“Pairwise-complete correlation considered dangerous”,翻譯過來就是成對完全相關分析可能造成一些錯誤結果,作者爲B. W. Lewis。

這個案例首先構造了一個數據。3列 x 5行的矩陣,其中第三列的第一行和第二行矩陣元素是缺失值NA。

x <- matrix(c(-2,-1,0,1,2,1.5,2,0,1,2,NA,NA,0,1,2),5)

接下來我們分別用不同use的參數設置來查看結果。這裏作者原文使用cor函數,但是我們前面的案例是使用pysch的corr.test函數,這裏就還是採用這個函數進行對應計算。而由於corr.test()對矩陣的計算似乎不是很友好,我們做個類型轉換,將矩陣轉爲數據框,也就是R語言的data.frame。

#數據轉換
xu <- data.frame(x)
colnames(xu) <- c("a", "b", "c")

#計算對應的相關係數矩陣
corr.test(xu, use = "everything", , adjust = 'none')
corr.test(xu, use = "pairwise", adjust = 'none')
corr.test(xu, use = "complete.obs", adjust = 'none')
corr.test(xu, use = "pairwise.complete.obs", adjust = 'none')

use等於everything時候的輸出結果。所謂的傳播就是,含有NA的第三列與第一列和第二列的相關係數只能爲NA,只要數據有NA就無法計算像相關係數。

use等於pairwise時候的輸出結果,可以發現a和b的相關係數爲0,a,b和c的相關係數爲1。那麼我們來解析下具體的計算。

相關係數的公式如下,然後可以計算下5個樣本下的協方差和並且繪製散點圖。

r=Cov(x,y)Var(x)Var(y)r=\frac{Cov(x,y)}{\sqrt{Var(x)Var(y)}}

plot(xu[,1], xu[,2], xlab = "a", ylab = "b", col = 'red', pch = 16)
cov(xu[,1], xu[,2])

協方差爲0,所以相關係數爲0。這就得到結果了。

pairwise計算的方式如下:由於a和b是沒有任何缺失值,5個值可以完全配對,所以在計算的時候a和b的相關係數是基於這5對數據計算,而對於a和c以及b和c的相關係數計算,由於c有缺失數據,可以完全配對的數據僅有三對,僅僅基於這三對配對樣本計算相關係數。這樣子對應計算出來的相關係數就是1了,因爲這些數據完全一致。因此就像Lewis先生說的一樣,由於在計算相關係數的時候,樣本不統一(在本案例中a和b的相關係數計算是5對配對樣本,a和c以及b和c的相關係數計算是3對配對樣本),事實上這樣計算的相關係數不具備可比性,也可能混淆原來數據的關係。

現在我們再來看complete.obs,可以發現這是a,b,c的相關係數全爲1。這是怎麼計算出來的呢?根據對數據的觀察可以發現,矩陣數據的第三到第五行的每一列數據都是相同的。

complete.obs的計算方式:由於c有缺失數據,在計算前必須去除掉所有NA的行,也就是去除掉第一行和第二行的所有數據再進行相關係數的計算。這樣子所有a,b,c三個變量都僅有3個數據。而且是全部一致的變量。因此這就是完美的完全相關(r=1)。

至於pairwise.complete.obs結果與pairwise是一樣的結果,我目前沒有發現太大的差別。

因此正如Lewis先生說的,有時候完全匹配樣本的分析反而容易造成對數據的曲解。當然最好的方式是獲取更多的觀測樣本。

最後回到同學的數據,爲什麼只針對b和c做相關分析的結果與針對b,c,d做相關分析的時候,b和c的相關係數有差異呢?

我們可以看到存在差異的語句是由於使用了complete.obs,因爲complete.obs會刪除NA數據,當僅針對b和c做相關分析的時候,不存在NA數據,所有是針對所有41個數據計算得到的相關係數。而由於d存在NA數據,在對b,c和d做相關分析的時候,必須刪除那一列,所以b,c和d都是僅剩下40個數據計算得到的相關係數。所有有差異是可以理解的。而當採用pairwise的時候,即使有NA數據存在,b和c的相關係數計算也不會因爲有NA而去除掉b和c對應的那行數據,所有前後樣本數據量一致,相關係數自然不會有變化。

另一個角度反應出來,d那一行的數據對這三個變量的數學關係影響還是比較大的,因爲有些情況隨機模擬出來的數據,也不一定會有明顯的相關係數差異。因此針對缺失值如何處理還是要根據數據具體情況而言。由於我之前通常在相關分析前就去除了NA值,所以我也沒遇到過這個情況。這其實是非常有意思的統計分析診斷。

相同數據,不同use方法的相關係數矩陣可視化。

本文使用的代碼,我會放到我應用統計學與R語言實現筆記的開源github倉庫上,有興趣的同學歡迎自行下載。

Note-of-Applied-Statistics-with-R

參考鏈接:

Pairwise-complete correlation considered dangerous

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章