天天看點

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

昨天剛好有位同學來咨詢R語言裡計算相關系數的一些問題,是以來談談關于缺失值的相關系數分析問題,主要是在R語言中如何處理含缺失值資料的相關系數分析。

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

1 問題描述

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例
應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

可以清楚地看到在隻計算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)           
應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

接下來我們分别用不同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就無法計算像相關系數。

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

$$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])           
應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

協方差為0,是以相關系數為0。這就得到結果了。

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

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

應用統計學與R語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

是以正如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語言實作筆記(番外篇三)——缺失值的相關系數分析1 問題描述2 R語言相關分析中的缺失值處理原理3 “Pairwise-complete correlation considered dangerous”案例

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

Note-of-Applied-Statistics-with-R

參考連結:

Pairwise-complete correlation considered dangerous

繼續閱讀