分析與可視化說透:從相關(guān)矩陣到網(wǎng)絡(luò)圖)
從相關(guān)矩陣到網(wǎng)絡(luò)圖一次把R的相關(guān)分析與可視化說透先說個(gè)我遇見的事兒。某次項(xiàng)目匯報(bào)對(duì)方興沖沖拉出一張布滿星星的相關(guān)矩陣熱圖指著上面一片“***”說“你看這些變量全都顯著相關(guān)項(xiàng)目有戲?!蔽颐榱艘谎凵Ⅻc(diǎn)圖心里直嘆氣那分明是一個(gè)變量被極端值拉出來的“虛假直線”幾個(gè)所謂顯著相關(guān)換了穩(wěn)健方法立馬變不顯著。這不是個(gè)例——太多人把“統(tǒng)計(jì)分析”做成了“跑個(gè)函數(shù)出個(gè)圖”卻忽略了相關(guān)分析真正見功夫的地方數(shù)據(jù)形態(tài)、系數(shù)選型、缺失值處理、可視化后的正確解讀。這篇文章就圍繞“用R做相關(guān)分析及其制圖可視化”展開我會(huì)先從相關(guān)分析的底層邏輯講起幫你搞明白r值和p值到底在說什么再比較Pearson、Spearman、Kendall三種系數(shù)怎么選接著用R的mtcars數(shù)據(jù)集完整走一遍數(shù)據(jù)準(zhǔn)備、相關(guān)計(jì)算、顯著性檢驗(yàn)的實(shí)操流程然后重點(diǎn)展示從散點(diǎn)圖、相關(guān)矩陣圖到熱圖和網(wǎng)絡(luò)圖的四級(jí)可視化最后聊幾個(gè)實(shí)戰(zhàn)中繞不開的坑包括多重比較校正、異常值影響、置信區(qū)間解讀這些不踩一遍不會(huì)重視的問題。無論你是剛上手R的初學(xué)者還是從SPSS遷移過來的熟練工這篇都能幫你把相關(guān)分析這步做得更扎實(shí)。1. 想清楚相關(guān)分析在解決什么問題再打開RStudio1.1 散點(diǎn)圖先行先看形態(tài)再算系數(shù)我在帶新人做數(shù)據(jù)分析時(shí)定的第一條規(guī)矩是任何相關(guān)分析之前必須先把兩兩變量的散點(diǎn)圖畫出來。原因很簡單——相關(guān)系數(shù)是一組數(shù)據(jù)經(jīng)過復(fù)雜計(jì)算后壓縮出來的單個(gè)數(shù)字它一旦被算出來原始數(shù)據(jù)的形態(tài)就看不到了。這就是著名的Anscombe四重奏告訴我們的道理四組數(shù)據(jù)計(jì)算出來的相關(guān)系數(shù)幾乎完全一樣約0.816但把它們畫成散點(diǎn)圖一組是漂亮的線性關(guān)系一組是明顯的曲線關(guān)系一組是被一個(gè)離群點(diǎn)統(tǒng)治的“偽直線”一組則是一堆散亂點(diǎn)外加一個(gè)杠桿點(diǎn)支撐起整個(gè)趨勢(shì)。如果你只報(bào)告相關(guān)系數(shù)這四組數(shù)據(jù)在你眼里就“一模一樣”但這顯然是荒謬的。所以實(shí)操習(xí)慣應(yīng)該是這樣先pairs()掃一眼再用cor()算數(shù)。R里面畫基礎(chǔ)散點(diǎn)圖矩陣一句話就夠pairs(mtcars[, c(mpg, disp, hp, wt)], pch 19, col rgb(0, 0, 0, 0.6))看到對(duì)角線之外的小圖你會(huì)很快建立對(duì)數(shù)據(jù)整體面貌的判斷哪些變量看起來線性、哪些明顯彎、哪些全是離群點(diǎn)。這個(gè)步驟花不了10秒但能幫你免掉后面一堆“假顯著”的麻煩。1.2 r值的幾何直覺標(biāo)準(zhǔn)化之后就是夾角余弦很多人背過公式但沒建立直覺。相關(guān)系數(shù)的數(shù)學(xué)定義是協(xié)方差除以兩個(gè)變量標(biāo)準(zhǔn)差的乘積$$r \frac{Cov(x,y)}{s_x s_y}$$概念上可以理解為先把x和y都做標(biāo)準(zhǔn)化減去均值除以標(biāo)準(zhǔn)差然后求這兩個(gè)標(biāo)準(zhǔn)化向量的內(nèi)積再除以n-1。學(xué)過線性代數(shù)的朋友會(huì)發(fā)現(xiàn)這本質(zhì)上就是兩個(gè)向量夾角的余弦值——所以r永遠(yuǎn)落在[-1, 1]區(qū)間內(nèi)。當(dāng)兩個(gè)變量的變化方向完全一致時(shí)標(biāo)準(zhǔn)化后的向量重合夾角為零r等于1完全相反時(shí)r等于-1毫無關(guān)系時(shí)兩個(gè)向量正交r接近0。這個(gè)幾何直覺非常有用。它提醒你r衡量的是“線性關(guān)系”的強(qiáng)度和方向不是任意的關(guān)聯(lián)。兩個(gè)變量即使存在完美的二次曲線關(guān)系r也可能算出來是0。這也是我在第一節(jié)強(qiáng)調(diào)散點(diǎn)圖先行的原因——只有看到真實(shí)的數(shù)據(jù)形態(tài)你才知道用線性相關(guān)系數(shù)是不是合適的選擇。1.3 p值不是效應(yīng)量解讀相關(guān)分析的第二支柱算出r之后R會(huì)順手給你一個(gè)p值。它的邏輯是這樣的在原假設(shè)“兩個(gè)變量的總體相關(guān)系數(shù)等于0”的前提下根據(jù)樣本量和r的大小計(jì)算出一個(gè)t統(tǒng)計(jì)量然后看這個(gè)t值有多“極端”。p值小說明當(dāng)前樣本數(shù)據(jù)與“總體無關(guān)”的假設(shè)不太兼容于是你很自然地認(rèn)為變量之間確實(shí)存在某種相關(guān)。但是這個(gè)定義有兩處必須強(qiáng)調(diào)。第一p值受樣本量影響極大樣本量5000時(shí)r0.03也會(huì)有漂亮的p0.001樣本量15時(shí)r0.6可能也達(dá)不到顯著。第二p值衡量的是“是否顯著”r值衡量的是“關(guān)系多強(qiáng)”這兩個(gè)維度缺一不可。實(shí)際寫報(bào)告時(shí)我的習(xí)慣是總報(bào)告置信區(qū)間cor.test(mtcars$mpg, mtcars$wt, method pearson)cor.test輸出的置信區(qū)間比單獨(dú)的p值信息量大得多。比如mpg和wt的相關(guān)系數(shù)它可能是-0.8795%置信區(qū)間為[-0.94, -0.74]這意味著在大量重復(fù)抽樣中總體相關(guān)的可能范圍都不會(huì)越過0結(jié)論相當(dāng)穩(wěn)固。如果置信區(qū)間跨過0就算點(diǎn)估計(jì)是-0.4你也應(yīng)該把這個(gè)結(jié)果視作“方向未定”。2. 別上來就cor()三種相關(guān)系數(shù)的選型邏輯用R做相關(guān)分析時(shí)最常見的懶人寫法是這樣cor(data)默認(rèn)算的是Pearson積差相關(guān)。很多教程也默認(rèn)這個(gè)選擇但套用一句話說默認(rèn)參數(shù)只代表“軟件默認(rèn)”不代表“統(tǒng)計(jì)正確”。實(shí)際工作中你得先回答一個(gè)問題我的數(shù)據(jù)配得上Pearson嗎2.1 Pearson連續(xù)、線性、干凈的數(shù)據(jù)才配得上它Pearson相關(guān)系數(shù)計(jì)算時(shí)直接使用原始數(shù)值所以它對(duì)三個(gè)前提敏感變量是等距或比率尺度連續(xù)型變量之間的關(guān)系是線性的數(shù)據(jù)中沒有極端異常值。醫(yī)療研究里的身高體重、生物學(xué)里的基因表達(dá)量適度清洗后、工業(yè)場(chǎng)景里的溫度和壓力這些連續(xù)且大致呈線性關(guān)系的數(shù)據(jù)用Pearson都很自然。它的優(yōu)點(diǎn)也很明顯統(tǒng)計(jì)檢驗(yàn)的效能最高在同樣樣本量下最容易檢出真實(shí)存在的相關(guān)。而且在變量近似正態(tài)分布時(shí)它是最佳線性無偏估計(jì)意義上的最優(yōu)選擇。但如果數(shù)據(jù)里有一個(gè)明顯的離群點(diǎn)Pearson可能被單個(gè)點(diǎn)拉扯得面目全非這一點(diǎn)我放在第5章專門講。2.2 Spearman把數(shù)據(jù)變成排名再說話Spearman的做法是先把每個(gè)變量的原始值轉(zhuǎn)換成秩也就是排名然后對(duì)秩計(jì)算Pearson相關(guān)。這樣做的好處是它只關(guān)心單調(diào)關(guān)系不要求線性對(duì)異常值的敏感度大大降低因?yàn)闃O端值再多也只占一個(gè)排名位置。四六級(jí)成績與績點(diǎn)的關(guān)系、用戶評(píng)分與購買頻次的關(guān)系、各種李克特量表數(shù)據(jù)這類“序數(shù)型”或“分布偏得厲害”的數(shù)據(jù)Spearman都是更穩(wěn)妥的選擇。代碼上和Pearson的區(qū)別只是一個(gè)參數(shù)cor.test(mtcars$mpg, mtcars$hp, method spearman)實(shí)測(cè)下來你會(huì)發(fā)現(xiàn)當(dāng)數(shù)據(jù)比較“乖”時(shí)Spearman和Pearson的結(jié)果通常非常接近一旦數(shù)據(jù)出現(xiàn)非線性單調(diào)關(guān)系或異常值Spearman往往更能反映真實(shí)趨勢(shì)。2.3 Kendall小樣本和同秩數(shù)據(jù)多的穩(wěn)健派Kendall的τ系數(shù)思路更樸素對(duì)兩個(gè)變量的每一對(duì)觀測(cè)值判斷這對(duì)值在兩個(gè)變量上的變化方向是否一致然后統(tǒng)計(jì)一致性比例。它不依賴于數(shù)值本身只依賴于“對(duì)”的方向所以對(duì)異常值幾乎“免疫”在小樣本或同秩tie很多的數(shù)據(jù)里表現(xiàn)更穩(wěn)。它的數(shù)值通常比Pearson和Spearman略小但這不是錯(cuò)誤而是定義方式不同。比如你要分析12個(gè)樣本之間兩種測(cè)量方法的一致性或者調(diào)查問卷得來的幾十個(gè)有序分類數(shù)據(jù)我建議優(yōu)先考慮Kendall。它的計(jì)算速度在大樣本下會(huì)慢一些但樣本量通常撐不到那個(gè)級(jí)別。2.4 三種系數(shù)怎么選一張表說清楚系數(shù)類型數(shù)據(jù)尺度關(guān)系形態(tài)要求對(duì)異常值敏感度典型場(chǎng)景Pearson積差相關(guān)連續(xù)型等距/等比線性關(guān)系高生理指標(biāo)、物理測(cè)量、表達(dá)量數(shù)據(jù)Spearman秩相關(guān)連續(xù)型或有序型單調(diào)關(guān)系即可低問卷量表、偏態(tài)數(shù)據(jù)、序數(shù)數(shù)據(jù)Kendall秩相關(guān)任意有序數(shù)據(jù)單調(diào)關(guān)系即可極低小樣本、同秩多的數(shù)據(jù)、一致性評(píng)價(jià)我在實(shí)際項(xiàng)目中采用的原則很樸素畫完散點(diǎn)圖覺得形態(tài)還線性且沒有明顯異常值用Pearson只要形態(tài)彎曲或分布偏態(tài)立刻切Spearman或Kendall不用糾結(jié)太多。因?yàn)榉治龇?wù)的是判斷不是形式。3. 從原始數(shù)據(jù)到相關(guān)矩陣R語言里的標(biāo)準(zhǔn)動(dòng)作3.1 選數(shù)據(jù)別把不該算的變量一把梭塞進(jìn)矩陣分析的第一步不是寫cor()而是想清楚“哪些變量應(yīng)該被放進(jìn)相關(guān)分析”。我見過太多人把編號(hào)列、ID列、單位不同的一堆指標(biāo)全扔進(jìn)cor()里結(jié)果輸出一片亂碼。正確做法是先確定分析目標(biāo)再構(gòu)造一個(gè)只含分析所需變量的數(shù)據(jù)框。用內(nèi)置數(shù)據(jù)集mtcars演示假設(shè)我們要研究汽車油耗mpg和哪些車輛屬性關(guān)聯(lián)最緊密df - mtcars[, c(mpg, disp, hp, wt, qsec)]這幾列分別是油耗、排量、馬力、車重、四分之一英里加速用時(shí)。檢查一下數(shù)據(jù)結(jié)構(gòu)確認(rèn)沒有亂七八糟的因子或字符串混在里面str(df) summary(df)str確認(rèn)類型summary幫你快速掃一遍取值范圍為后面的異常值風(fēng)險(xiǎn)做心理準(zhǔn)備。3.2 缺失值怎么處理complete.obs、pairwise.complete.obs和rcorr的默認(rèn)行為真實(shí)數(shù)據(jù)幾乎沒有完整的所以這個(gè)坑必繞不開。R的cor()函數(shù)里控制缺失值的參數(shù)是use常見的取值有三種everything默認(rèn)只要數(shù)據(jù)里有NA結(jié)果直接輸出NA最老實(shí)但也最沒用。complete.obs只保留所有變量都非缺失的整行樣本即所謂的列刪法listwise deletion。數(shù)據(jù)缺失較多時(shí)樣本量會(huì)被砍掉一大截造成浪費(fèi)。pairwise.complete.obs逐對(duì)計(jì)算時(shí)只使用這對(duì)變量都非缺失的樣本即所謂的成對(duì)刪法pairwise deletion。每個(gè)相關(guān)系數(shù)可能基于不同數(shù)量的樣本但能最大限度利用現(xiàn)有數(shù)據(jù)。我看到不少分析報(bào)告直接默認(rèn)cor(x)結(jié)果輸出一片NA然后人傻在那里。如果你確認(rèn)缺失值比例可以接受我通常建議用pairwise.complete.obs做探索性分析如果樣本量足夠且缺失模式是隨機(jī)的用complete.obs做正式報(bào)告也可以。還有第三種更穩(wěn)妥的姿態(tài)用Hmisc包中的rcorr()它內(nèi)部也是成對(duì)刪除而且能同時(shí)返回相關(guān)系數(shù)矩陣和p值矩陣library(Hmisc) res - rcorr(as.matrix(df), type pearson) res$r # 相關(guān)系數(shù)矩陣 res$P # 顯著性p值矩陣 res$n # 各對(duì)樣本的有效樣本量rcorr需要矩陣輸入所以先as.matrix。輸出后你會(huì)同時(shí)拿到r矩陣和P矩陣這對(duì)后續(xù)篩選顯著相關(guān)非常方便。3.3 單個(gè)關(guān)系細(xì)看cor.test是必做動(dòng)作相關(guān)矩陣適合全局掃視但如果你對(duì)某對(duì)變量特別感興趣比如“油耗和車重到底關(guān)系多強(qiáng)”那必須用cor.test細(xì)看cor.test(df$mpg, df$wt, method pearson)它會(huì)給出r值、t統(tǒng)計(jì)量、自由度、p值以及95%置信區(qū)間。實(shí)操時(shí)我不會(huì)只看p值而是重點(diǎn)看置信區(qū)間上下界。比如區(qū)間是[-0.94, -0.74]這個(gè)關(guān)系相當(dāng)穩(wěn)定如果區(qū)間是[-0.85, 0.12]那你得承認(rèn)雖然點(diǎn)估計(jì)看著有點(diǎn)嚇人但證據(jù)其實(shí)撐不住“確定存在相關(guān)”的結(jié)論。很多人報(bào)告相關(guān)矩陣時(shí)只寫r和p這不算錯(cuò)但丟了區(qū)間就是丟了信息量。3.4 批量篩選從幾十個(gè)變量里快速找到重點(diǎn)關(guān)系當(dāng)變量多了以后手工一對(duì)對(duì)看cor.test不現(xiàn)實(shí)我習(xí)慣在rcorr的結(jié)果上直接做篩選r_mat - res$r p_mat - res$P sig_mask - p_mat 0.05然后用sig_mask去過濾r_mat只保留顯著的相關(guān)系數(shù)再結(jié)合5.1的多重比較校正做進(jìn)一步篩查。這個(gè)流程跑下來一次性從20個(gè)變量里挑出5個(gè)核心關(guān)系非常高效。4. 制圖可視化的三層遞進(jìn)散點(diǎn)圖、相關(guān)矩陣圖、網(wǎng)絡(luò)圖4.1 基礎(chǔ)圖形不能省pairs和ggplot2的散點(diǎn)圖矩陣相關(guān)分析的可視化我從不用一張熱圖打發(fā)全部需求。第一件該做的事是散點(diǎn)圖矩陣它能讓你看到所有兩兩關(guān)系的形態(tài)?;A(chǔ)pairs()畫得快但不好看要想拿得出手我推薦用ggplot2手動(dòng)構(gòu)造一個(gè)精修版library(ggplot2) library(GGally) df_plot - df ggpairs(df_plot, upper list(continuous wrap(cor, size 4)), lower list(continuous smooth))GGally包的ggpairs會(huì)在對(duì)角線放密度曲線或直方圖上三角放相關(guān)系數(shù)下三角放散點(diǎn)圖和平滑擬合線。血管里的東西一目了然mpg與wt的散點(diǎn)圖是一條清晰的負(fù)斜率直線而mpg與qsec的散點(diǎn)圖有點(diǎn)彎這時(shí)就該警覺Pearson的r值可能會(huì)低估真實(shí)關(guān)系的強(qiáng)度。4.2 corrplot一張相關(guān)矩陣圖把格局拉開當(dāng)變量數(shù)量在5到15個(gè)之間時(shí)corrplot包畫的圓形相關(guān)矩陣圖非常經(jīng)典。它用圓圈大小表示|r|的大小用顏色表示正負(fù)信息密度和美觀度都不錯(cuò)library(corrplot) cor_matrix - cor(df, use complete.obs, method pearson) corrplot(cor_matrix, method color, type upper, order hclust, addCoef.col black, tl.col black, tl.srt 45, number.cex 0.8)這里的幾個(gè)參數(shù)值得解釋method color用顏色方塊表示數(shù)值既有直觀視覺沖擊又能看清大小。type upper只保留上三角因?yàn)橄嚓P(guān)矩陣是對(duì)稱的全畫出來徒增視覺負(fù)擔(dān)。當(dāng)然如果就是要展示對(duì)稱之美或者強(qiáng)調(diào)某個(gè)變量的關(guān)系用full也無妨。order hclust按層次聚類結(jié)果的順序重排變量讓相關(guān)性相近的變量靠在一起矩陣看起來有聚類的結(jié)構(gòu)。這在變量多時(shí)尤其重要否則只是一團(tuán)混亂的顏色。圖上每一個(gè)格子里面我還加了相關(guān)系數(shù)數(shù)值addCoef.col這樣看圖的人不用再猜顏色塊到底代表0.6還是0.7。你可以把這個(gè)圖直接導(dǎo)出成PDF或PNG放進(jìn)報(bào)告外觀完全夠格。4.3 熱圖加聚類ggcorrplot更現(xiàn)代的做法如果團(tuán)隊(duì)里的成員更習(xí)慣看類似Python seaborn風(fēng)格的熱圖R這邊我用ggcorrplot替代library(ggcorrplot) p - ggcorrplot(cor_matrix, hc.order TRUE, type lower, lab TRUE, lab_size 3, colors c(#6D9EC1, white, #E46726), outline.color gray60) print(p)hc.order自動(dòng)做聚類順序排列typelower取左下三角。這樣一來變量會(huì)自動(dòng)“物以類聚”相關(guān)性強(qiáng)的一組在視覺上擠成一個(gè)深色塊相關(guān)性弱的分隔出白色區(qū)域。這張圖我做業(yè)務(wù)匯報(bào)時(shí)幾乎總會(huì)放一張因?yàn)槁牨姴挥盟伎肌案褡幼鴺?biāo)是什么”只看顏色聚集就能讀懂“誰和誰有關(guān)系”。4.4 再進(jìn)階一步用igraph把相關(guān)矩陣畫成網(wǎng)絡(luò)圖當(dāng)變量數(shù)量突破20個(gè)相關(guān)矩陣再精巧也是密密麻麻一片這時(shí)候網(wǎng)絡(luò)圖反而是更好的表達(dá)工具。網(wǎng)絡(luò)圖的思路很直接每個(gè)變量是節(jié)點(diǎn)相關(guān)系數(shù)絕對(duì)值超過某個(gè)閾值的變量之間連一條邊邊顏色區(qū)分正負(fù)相關(guān)節(jié)點(diǎn)大小反映它在整個(gè)網(wǎng)絡(luò)中的連接強(qiáng)度。library(igraph) cor_matrix_threshold - cor_matrix cor_matrix_threshold[abs(cor_matrix_threshold) 0.6] - 0 net - graph_from_adjacency_matrix(cor_matrix_threshold, mode undirected, weighted TRUE, diag FALSE) E(net)$color - ifelse(E(net)$weight 0, #E46726, #6D9EC1) E(net)$width - abs(E(net)$weight) * 3 V(net)$size - degree(net) * 8 set.seed(123) plot(net, layout layout_with_fr(net))需要注意閾值不是亂定的。0.6是我在探索階段常用的經(jīng)驗(yàn)值但你應(yīng)該根據(jù)樣本量和業(yè)務(wù)背景調(diào)整。閾值太高網(wǎng)絡(luò)里節(jié)點(diǎn)會(huì)孤立得七零八落閾值太低全網(wǎng)連成一團(tuán)等于沒畫。我通常會(huì)在0.4到0.7之間掃一遍挑一個(gè)既能看清主要群落、節(jié)點(diǎn)又不至于全部“單飛”的閾值。網(wǎng)絡(luò)圖的最大價(jià)值不是替代相關(guān)矩陣而是幫你找到“變量群落”。比如你可能會(huì)發(fā)現(xiàn)某幾個(gè)業(yè)務(wù)指標(biāo)形成了一個(gè)密集連接的小團(tuán)體另幾個(gè)指標(biāo)孤立在角落——這背后的業(yè)務(wù)含義往往比單個(gè)r值有價(jià)值得多。5. 實(shí)戰(zhàn)里的坑與解多重比較、異常值、置信區(qū)間一個(gè)都不能少5.1 多重比較一張矩陣幾十個(gè)“顯著”真沒這么簡單假設(shè)你有10個(gè)變量pairwise相關(guān)對(duì)數(shù)就有45對(duì)。即便總體中完全不存在任何相關(guān)在0.05的顯著性水平下平均也會(huì)有約2.25對(duì)顯著。變量到了20個(gè)190對(duì)里憑空冒出來的“顯著結(jié)果”接近10個(gè)。這就是做相關(guān)矩陣最容易踩的大坑把每一對(duì)的p值當(dāng)成“獨(dú)立檢驗(yàn)”來看。要解決它思路和方差分析后的兩兩比較一致——對(duì)p值做多重比較校正p_vec - p_mat[upper.tri(p_mat)] p_adj - p.adjust(p_vec, method BH)BHBenjamini-Hochberg方法控制錯(cuò)誤發(fā)現(xiàn)率在探索性分析里是常用且不太“暴力”的選擇。如果你想更保守可以用Bonferronimethodbonferroni它會(huì)直接拿顯著性水平除以檢驗(yàn)次數(shù)代價(jià)是可能會(huì)漏掉很多真實(shí)存在的弱相關(guān)。我個(gè)人的選擇是探索階段用BH正式報(bào)告前用更嚴(yán)格的方法復(fù)核一遍。不過有一點(diǎn)也得說清楚嚴(yán)格校正后沒通過不代表關(guān)系一定不存在更可能是功效不足你可以把它標(biāo)記為“待驗(yàn)證”而不是“無相關(guān)”。5.2 異常值一個(gè)點(diǎn)毀掉一條線異常值對(duì)Pearson相關(guān)的影響是災(zāi)難性的。比如10個(gè)點(diǎn)原本呈現(xiàn)明顯的負(fù)相關(guān)r-0.3只要在右上方塞進(jìn)一個(gè)“離群點(diǎn)”r可能瞬間變成正0.4。這個(gè)數(shù)字反轉(zhuǎn)的魔術(shù)我在很多項(xiàng)目里見過。應(yīng)對(duì)方法有三層。第一層是“可視化發(fā)現(xiàn)”散點(diǎn)圖矩陣上掃一圈看看有沒有孤獨(dú)的點(diǎn)飄在主體數(shù)據(jù)之外。第二層是“穩(wěn)健替換”用Winsorize方法把極端值壓縮到合理分位數(shù)然后用壓縮后的數(shù)據(jù)再做相關(guān)或者直接用Spearman相關(guān)系數(shù)秩相關(guān)天然降權(quán)極端值。第三層是“分而治之”把數(shù)據(jù)按某個(gè)關(guān)鍵維度分組比如不同地區(qū)分開做相關(guān)分析看每組內(nèi)的相關(guān)方向和強(qiáng)度是否一致。不分組只看整體有時(shí)候會(huì)得到“平均效應(yīng)”掩蓋真實(shí)關(guān)系的結(jié)論。5.3 置信區(qū)間點(diǎn)估計(jì)只說了一半的故事有人在報(bào)告里寫“r0.8p0.001”聽起來關(guān)系強(qiáng)又顯著但實(shí)際上可能樣本量只有10置信區(qū)間是[-0.1, 0.96]從強(qiáng)正相關(guān)到零相關(guān)都在合理范圍內(nèi)??尚艈嵴f實(shí)話證據(jù)相當(dāng)弱。所以在正式報(bào)告里相關(guān)系數(shù)至少要附帶置信區(qū)間或者明確報(bào)告樣本量。R里cor.test給別人看它天然輸出置信區(qū)間批量計(jì)算的話可以用corrplot包里的cor.mtest或者自寫bootstrap函數(shù)library(boot) boot_cor - function(data, indices) { d - data[indices, ] return(cor(d$mpg, d$wt, method pearson)) } set.seed(123) b - boot(df, boot_cor, R 1000) boot.ci(b, type perc)這個(gè)bootstrap置信區(qū)間不依賴正態(tài)假設(shè)對(duì)異常值也更寬容。我通常在變量關(guān)系不太干凈時(shí)用它替代cor.test自帶的近似區(qū)間。5.4 報(bào)告呈現(xiàn)數(shù)字背后要讓人看得懂最后聊一下報(bào)告習(xí)慣。我見過一個(gè)反面的極端有人把四五十個(gè)變量的相關(guān)矩陣整頁貼在PPT上完全沒有任何標(biāo)注讀者根本不知道重點(diǎn)在哪。建議的做法是只放重點(diǎn)變量或重點(diǎn)關(guān)系最多不超過10個(gè)核心結(jié)果。r值保留兩位小數(shù)p值寫成具體數(shù)字p0.012或者用“*p0.05, **p0.01”標(biāo)注同時(shí)在校注里說明沒有做多重比較校正或采用哪種校正法。把結(jié)論寫成一句話比如“油耗與車重呈顯著負(fù)相關(guān)r-0.8795%CI[-0.94,-0.74]說明車重越大油耗越高”。這句話比十個(gè)星星都有力。圖和表搭配使用散點(diǎn)圖矩陣證明數(shù)據(jù)形態(tài)corrplot展示全局格局最后報(bào)告里只點(diǎn)名核心結(jié)論。我每次跑相關(guān)分析無論多急都要給自己留三樣?xùn)|西一張散點(diǎn)圖矩陣確認(rèn)線性形態(tài)、一張帶顯著性標(biāo)注的相關(guān)矩陣圖觀察全局格局、一張經(jīng)過多重比較校正后的篩選結(jié)果表。先看圖再算數(shù)后下結(jié)論。這不是流程儀式感而是實(shí)打?qū)崕臀以陧?xiàng)目里避免過好幾次“拿假相關(guān)講故事”的尷尬。如果你之前是直接cor()然后截個(gè)圖放進(jìn)報(bào)告下次不妨試試這個(gè)思路——你的結(jié)論會(huì)穩(wěn)很多報(bào)告也不那么容易被同行問倒。