R 語言之數據分析「Resampling」

2021-02-13 表哥有話講

‍‍‍‍‍‍‍‍‍



本節主要總結「數據分析」的「Resampling」重抽樣思想,並通過 R 語言實現。

有一種東西叫作「傳統」,它在很多時候很有用,但會讓你思維固化,在新的環境下讓你出錯。

在總結回歸分析和方差分析的時候 ④R語言之數據分析「初章」,我總是會在模型的建立之前提到「統計假設」,在模型建立之後進行「假設檢驗」,原因想必大家都能理解,就是因為這些「統計假設」是我們模型建立思想的基礎,是支撐我們模型正確性的「必要條件」。但是,不可否認的是,這些「必要條件」最終會成為我們「數據分析」的局限,讓我們對「不滿足條件的數據集」束手無策。

本節,我們就來解決這個「必要條件」中的其中一條假設,從特例到普遍。

統計假設中有一條,叫做「假定觀測數據抽樣自正態分布或者是是其他性質較好的分布」,那麼當數據集抽樣自「未知分布、混合分布」、樣本容量過小或存在離群點時,傳統的統計方法所得到的模型可能就會不那麼準確,原因之前已經講過,這個時候「Resampling」 的思想就出現了。它拋棄了分布的理論,而是完全基於同一個樣本,在這個樣本中多次重複抽樣,然後將所有抽樣的結果作為總體,將原樣本放到其中去檢驗,判定其顯著性。因為需要多次重複抽樣,所有它被稱為重抽樣「Resampling」。


1. Resampling 的分類

1.1. 置換檢驗( permutation test )

這個方法是傳統統計方法的創建者 R. A. Fisher 建立的,但是由於這個方法的計算量過大、且計算機技術也未成熟,他最後放棄了這個方法。但是,數十年後的今天,計算機技術的高速發展,這個方法終於能夠實現並發揮其價值。

為了更清楚的說明置換檢驗的思想,我舉一個「兩總體均值之差」的推斷問題:

現在有兩套學習方案 A 和 B,在 10 個受試者中隨機抽取 5 個按照方案 A 學習,另外 5 個按照方案 B 學習,在學習完畢後對 10 個受試者進行測試,得到分數如下:              方案 A                 方案 B          91                    89          88                    78          76                    93          79                    81          82                    77原假設H_{0} :兩種方案的總體均值相等 ;備擇假設H_{a}:兩種方案的總體均值不等

這種問題,用參數方法來解決你應該是很熟悉的,現在我來解釋置換檢驗的思想是怎樣的。置換檢驗的思想下,由於我們原假設兩個方案的總體均值是相等的,那麼如果兩種方案真的是等價的話,則 10 個受試者的分數的分配應該是任意的。這麼講你可能還是不太理解,其實在原假設成立的前提下,我們把兩種方案的總體視為等價的,那麼我們同樣也可將這兩個方案的總體視為同一個總體,這樣的話,10 個受試者者的分數在可以在任意位置,而不用在乎這個位置是屬於方案 A 還是方案 B。在這樣的前提下,我們利用重抽樣得到一個「源於已有樣本的抽樣分布」,再利用 t 統計量在這個「源於已有樣本的抽樣分布」上判別初始觀測數據的顯著性,具體步驟如下:


1. 計算初始觀測數據的 t 統計量,記為 t0
2. 將初始觀測數據的 10 個得分,作為一個「重抽樣的總體」,從中抽取 5 個放到 A 組,另五個放到 B 組,並計算此種情況下的 t 統計量
3. 重複步驟 2,直到窮盡所有可能。其實就是一個組合問題,一共有252種可能
4. 將 252 種可能的 t 統計量,按照從小到大排序,得到了「源於已有樣本的抽樣分布」
5. 根據t0在此分布中的位置,和我們確定的顯著性水平,判別原假設我們可否拒絕

1.2. 交叉驗證( Cross validation )

在交叉驗證的思想中,一個樣本被隨機的分成兩個或 K 個子樣本,將其中一個作為驗證集,其他 K-1 個子樣本組合成訓練集,在訓練集上獲得回歸方程,而後在驗證集上做出預測,這為一重驗證,而後所有子樣本輪流充當驗證集,如此往復,直至遍歷所有可能。這樣我們就可以得到 K 個「預測誤差」,求其平均值即為所謂的「 CV 值」,所以常說的 CV 值實際上是預測誤差期望Err的一個估計值。

交叉驗證的思想比較容易理解,也是一種十分符合我們直覺的驗證方法,這裡就不舉例說明了。
但值得注意的一點是,K 的取值會影響我們預測的準確性,具體是怎麼影響的涉及到「偏誤」、「方差」以及「計算效率」的權衡,主要是「偏誤」與「計算效率」的權衡,這裡就不深究,感興趣的同學可以看看 「模型選擇的一些基本思想和方法」這篇文章。

不過,我們可以粗略的設置 K 的取值:

大樣本,5 重交叉驗證,對預測誤差的估計已經足夠準確,這裡偏向於增大計算效率

小樣本,10重交叉驗證,為了得到相對準確的估計,這裡考慮損失計算效率


1.3. 刀切法( Jackknife )

刀切法的思想,十分適用於分布的分散過寬或者出現異常值的數據,通俗來講就是「既然我們所擁有的數據都只是樣本,都是抽樣得到的,那麼我們在做推斷和估計的時候,扔掉幾個觀測,看看效果如何。」在刀切法中我們反覆的行為就是從樣本中選取一個觀測,把它拋棄,而後利用剩餘的數據做出估計,如此往復,直到每一個觀測都被拋棄過一次。根據每次估計的統計量,取均值,而後將這個均值與原樣本(沒有觀測沒拋棄)上估計到到的統計量想比較,就可以得到「偏差校正刀切估計值」。我的表述可能你能聽懂,但是還理解不深,下面我舉例說明。

因為一個理科生的各科成績之間可能存在某種相關性,現在我們想用用學生的物理成績和化學成績來預測他的數學成績,現在有 50 個觀測:         序號      物理      化學      數學      1        78       87        90      2        88       79        83      3        67       71        78      …        …        …         …      50       89       88        92

1.4. Bootstrap

與刀切法相比,Bootstrap 法的重抽樣思想更加透徹。刀切法的重抽樣次數與觀測數量有關,而 Bootstrap 法的抽樣次數理論上是沒有上限的,將原樣本在計算機性能允許的基礎上儘可能重複抽樣更多次,得到了一個「virtual population 」,從其中我們可以得到統計量的「虛擬潛在分布」,並根據此分布估計置信區間。

舉例說明:

現在有一個容量為 10 的樣本,均值 20,標準差 2,希望根據樣本估計總體均值的置信區間。

按照傳統思想,我們可以假設樣本分布為正態分布,而後根據正態分布計算總體均值的置信區間。但當樣本分布不服從正態分布時,可以利用 Bootstrap 法:
1. 有放回地從樣本中抽取 10 個觀測,並計算其均值(注意由於抽樣是有放回的,重抽樣得到的樣本與原樣本雖然容量相同,但是觀測不一定相同,因為有的觀測可能被多次選擇,有的可能一直都不會被選中)
2. 重複 1,次數為 2000
3. 將 2000 個均值升序排列
4. 確定顯著性水平,計算得到置信區間(例如:要求 95% 的置信區間,找出 2.5% 和 97.5% 的分位點,其中間部分就為 95% 的置信區間)


2. R 語言實現重抽樣

2.1. 置換檢驗

格式:

> function_name( formula , data , distribution = )# formula 是被檢驗變量之間的關係, data 是數據框,distribution 指定重抽樣的方式

這裡的重抽樣方式,除了之前將的按照完全排列組合抽樣之外( distribution = "exact" ),為了節省計算機資源,可以選擇根據漸進分布抽樣( distribution = "asymptotic" ),和蒙特卡洛重抽樣( distribution = "approxiamate(B=#)" )# 為重複次數,一般要設定隨機種子,以便將來重現。

2.1.1. 兩樣本和 K 樣本的獨立性檢驗( coin 包 )

兩樣本獨立性的參數檢驗法( 置換檢驗 )

兩樣本獨立性的非參數檢驗法( 置換檢驗 )

> wilcox_test(Prob ~ So ,data=UScrime,  distribution="exact")# 這裡表達式 ~ 的兩邊分別為應變量和分組變量# 傳統為 wilcox.test() 函數

K 樣本獨立性的參數檢驗法( 置換檢驗 )

> oneway_test(response ~ trt ,data=cholesterol,distribution="approxiamate(B=9999)")# 這裡表達式 ~ 的兩邊分別為應變量和分組變量# 傳統為 單因素方差分析

2.1.2. 列聯表中兩分組變量之間的獨立性檢驗( coin 包 )

> Arthritis <- transform(Arthritis,                       Improved=as.factor(as.numeric(Improved)))> set.seed(1234)> chisq_test(Treatment~Improved,data=Arthritis,           distribution=approximate(B=9999))# 這裡表達式 ~ 的兩邊分別為兩個分組變量# 如果使用有序因子,則次函數為線性趨勢檢驗,因此第一行代碼將 Improved 轉換成無序

2.1.3. 數值型變量之間的獨立性檢驗( coin 包 )

> states <- as.data.frame(state.x77)> set.seed(1234)> spearman_test(Illiteracy ~ Murder , data=states,              distribution=approximate(B=9999))# 這裡表達式 ~ 的兩邊分別為兩個數值型變量# coin 包中必須為數據框

2.1.4. 兩樣本和 K 樣本的相關性檢驗( coin包 )

兩樣本

> wilcoxsign_test(U1~U2,data=UScrime,distribution="exact")

K 樣本

> friedman_test(times ~ methods | block, data = rounding)

2.1.5. 簡單回歸和多項式回歸( lmPerm 包 )

簡單線性回歸(置換檢驗)

> set.seed(1234)> fit1 <- lmp(weight~height,data = women, perm="Prob")> summary(fit)# lmp() 函數與 lm() 函數類似,只是多了 perm 參數,其可選值有 Exact、Prob 或SPR# Exact 根據所有可能的排列組合生成精確檢驗。Prob 從所有可能的排列中不斷抽樣,直至估計的標準差在估計的 p 值 0.1 之下,判停準則由可選的 Ca 參數控制。SPR 使用貫序概率比檢驗來判斷何時停止抽樣。#  觀測數大於10,perm="Exact"將 自動默認轉為 perm="Prob",因為精確檢驗只適用於小樣本問題。

多項式回歸(置換檢驗)

> set.seed(1234)> fit2 <- lmp(weight~height+I(height^2),data=women,perm="Prob")> summary(fit)

2.1.6. 多元回歸(置換檢驗)

> set.seed(1234)> states <- as.data.frame(state.x77)> fit <- lmp(Murder ~ Population + Illiteracy + Income + Frost,           data=states, perm = "Prob")> summary(fit)

2.1.7. 單因素方差分析和協方差分析

單因素方差分析(置換檢驗)

> set.seed(1234)> fit <- aovp(response ~ trt, data = cholesterol, perm="Prob")> summary(fit)# aovp() 函數與 aov() 函數類似,只是多了 perm 參數,其可選值有 Exact、Prob 或 SPR

單因素協方差分析(置換檢驗)

> set.seed(1234)> fit <- aovp(weight ~ gesttime + dose, data=litter, perm="Prob")> summary(fit)

2.1.8. 雙因素方差分析

> set.seed(1234)> fit <- aovp(len~supp*dose, data = ToothGrowth, perm="Prob")> summary(fit)


2.2. 交叉驗證

《 R 語言實戰 》中的自編函數 shrinkage ( ) 可以實現 K 重交叉驗證,默認為 10 重,可以通過參數 k 修改。

> states <- as.data.frame(state.x77[,c("Murder", "Population", "Illiteracy", "Income", "Frost")])     > fit <- lm(Murder ~ Population + Income + Illiteracy + Frost, data=states)     > shrinkage(fit)

2.3. 刀切法

《 R 語言實踐 》中並未介紹刀切法的實現,可以參考以下代碼

# 抽樣得到樣本> set.seed(1234)> x <- rnorm(100,0,5)> # 運用刀切法重抽樣> jack <- function(x){+   jackknife <- 0+   for(i in 1:length(x)){+     jackknife[i]=length(x)*var(x)-(length(x)-1)/length(x)*sum(var(x[-i]))+   }+   return(jackknife)+ }> # 計算刀切法得到的抽樣方差> mean(jack(x))/length(x)[1] 24.97106> # 計算抽樣方差> var(x)[1] 25.22075

2.4. Bootstrap

格式:

# Bootstrap 重抽樣,並返回統計量> bootobject <- boot(data=, statistic=, R=, ...)# data 為原樣本,也是我們重抽樣的數據來源,可以是向量、矩陣或者數據框# statistic 為生成 k 個統計量的函數,這個函數的參數中必須包括 indices,indices 參數用於 boot() 對原樣本重抽樣# R 為重抽樣的次數# 獲取置信區間> boot.ci(bootobject, conf=, type= )# bootobject 為存儲重抽樣結果的對象# conf 為置信區間的置信度# type 為置信區間的類型

2.4.1. 對單個統計量使用自助法

> #獲取 R 平方值的自編函數> rsq <- function(formula, data, indices){+           d <- data[indices,]+           fit <- lm(formula, data=d)+           return(summary(fit)$r.square)+ }> #自助抽樣> set.seed(1234)> results <- boot(data=mtcars, statistic = rsq,+                 R=1000, formula=mpg~wt+disp)> #輸出 boot 對象> print(results)> plot(results)> #計算置信區間> boot.ci(results, type=c("perc","bca"))# type 參數為 perc 時展示的是樣本均值,為 bca 時將根據偏差對區間做簡單調整

2.4.2. 多個統計量的自助法

> #返回回歸係數向量的自編函數>  bs <- function(formula, data, indices){+    d <- data[indices,]+    fit <- lm(formula,data=d)+    return(coef(fit))+  }> #自助抽樣>  set.seed(1234)>  results <- boot(data=mtcars, statistic = bs,+                  R=1000, formula=mpg~wt+disp)>  #輸出 boot 對象>  print(results)>  plot(results,index=2)>  #計算置信區間>  boot.ci(results,type = "bca", index=2)>  boot.ci(results,type = "bca", index=3)# index 參數用於指明需要分析的重抽樣所得樣本的列


公眾號後臺回復關鍵字即可學習

回復 R                  R語言快速入門及數據挖掘 
回復 Kaggle案例  Kaggle十大案例精講(連載中)
回復 文本挖掘      手把手教你做文本挖掘
回復 可視化          R語言可視化在商務場景中的應用 
回復 大數據         大數據系列免費視頻教程 
回復 量化投資      張丹教你如何用R語言量化投資 
回復 用戶畫像      京東大數據,揭秘用戶畫像
回復 數據挖掘     常用數據挖掘算法原理解釋與應用
回復 機器學習     人工智慧系列之機器學習與實踐
回復 爬蟲            R語言爬蟲實戰案例分享

相關焦點

  • R 語言之數據分析高級方法「主成分分析」和「因子分析」
    本節主要總結「數據分析」的「主成分分析」和「因子分析」的思想。通過學習《 R 語言實戰 》關於這兩種方法的解釋,我們很容易理解這兩種方法其存在的意義。——降維。我們將要面對的數據實在是太大,變量實在太多,因此計算機所承受的壓力也會越來越大。信息過度複雜是多變量數據最大的挑戰之一,特別是在還要考慮變量間交互關係的時候,變量增加時交互關係的量是按階乘關係在往上漲的,所以降維在很多時候能夠起到減少大量工作量的作用,是數據分析很重要的一個思想。以上是「主成分分析」與「因子分析」聯繫,有共同的目的。
  • SQL/Tableau/Excel/Wind/R語言,一個月教你把「數據分析」技能寫入簡歷
    當我們進行了總計167人,覆蓋各年級相關專業&非相關專業的課研調查後,發現大部分同學都認可「數據分析」的重要性,卻在相關技能的學習方面面臨著諸多問題。沒有商科基礎,「商業分析」這種結合了數據、編程和金融的名詞,簡直是天敵!
  • 深度| R vs Python:R是現在最好的數據科學語言嗎?
    O』Reilly:R語言可以說是最常見的數據程式語言最後,媒體 O'Reilly 在過去的幾年裡進行了一次數據科學調查,他們使用調查數據來分析數據科學的趨勢。除了其他的之外,它們分析工具的使用情況來確定哪些工具是數據科學家最常使用的。
  • R與生物專題 | 第四十三講 R-回歸預測模型的自舉重採樣驗證(boostrap-resampling)
    在「R與生物統計專題」中,我們會從介紹R的基本知識展開到生物統計原理及其在R中的實現。
  • 中了數據可視化的毒:BBC如何使用R語言繪製數據圖表?
    我們將在這篇文章中介紹我們如何以及為何要使用 R 語言的 ggplot2 軟體包來創建可直接使用的圖表,我們也會給出我們的流程和代碼以及分享我們一路上所學到的東西。BBC 視覺與數據新聞團隊的數據記者已經使用 R 來執行複雜和可重複的數據分析以及構建原型一些時日了。
  • R語言數據分析利器——data.table包
    ,用於數據框格式數據的處理,最大的特點快。包括兩個方面,一方面是寫的快,代碼簡潔,只要一行命令就可以完成諸多任務,另一方面是處理快,內部處理的步驟進行了程序上的優化,使用多線程,甚至很多函數是使用C寫的,大大加快數據運行速度。因此,在對大數據處理上,使用data.table無疑具有極高的效率。這裡我們主要講的是它對數據框結構的快捷處理。
  • 全網最全 | R語言中的方差分析匯總
    方差分析,是統計中的基礎分析方法,也是我們在分析數據時經常使用的方法。下面我總結一下R語言如何對常用的方差分析進行操作。1.包的下載地址:https://cran.r-project.org/web/packages/agridat/index.html「包的介紹」❝「agridat: Agricultural Datasets」
  • R語言 | 回歸分析(一)
    如果我想問你觀察裡沒有的數據,比如沒有182cm數據,它對應的體重「可能」是多少呢?正如上面提到,我們可以「擬合」一條直線來描述相關性,那麼自然的可以通過這條直線來「預測」數據。這種分析思路,即所謂的回歸分析(regression analysis)。
  • 數據科學養成記 之 R語言基礎(2)——關於R包
    在上一節的學習中,我們已經學習了如何將數據導入R中進行數據分析。R作為一種主力的分析語言有著其獨特的優勢:大量的R包可供大家使用,提供方便快捷的數據分析,挖掘。目前有上千個R包(R package)可供大家使用,可從cran-r 下載。
  • 「Why-What-How」數據分析方法
    統一認知後,才能保證不同層級,不同部門的人在平等話語權和同一個方向進行討論和協作,才能避免公司內的人以「我感覺」「我猜測」來猜測當前業務的情況。除了「量化」之外,另外一個重點詞語是「業務」。只有解決業務問題分析才能創造價值,價值包括個人價值和公司價值。對於公司來講,你提高了收入水平或者降低了業務成本,對於個人來講,你知道怎麼去利用數據解決業務問題,這對個人的能力成長和職業生涯都有非常大的幫助。
  • RStudio|用R Markdown生成你的R語言數據分析報告
    個人公眾號:數據科學家養成記 (微信ID:louwill12)R Markadown 作為一款通過R語言創建動態文檔的寫作排版工具,為數據科學提供了現成的寫作框架。通過 R Markdown 不僅可以運行和保存R代碼,還可以生成高質量的數據分析報告並以HTML、PDF或者word的形式分享。
  • R 語言與數據挖掘直播培訓班
    最好的結果自然是「Paper 在手,天下我有」。 眾所周知,R 語言作為統計計算和統計製圖的優秀工具,能夠幫助科研人更順利地發 Paper,能夠掌握這門複雜的開發語言是很多科研人的心願。
  • 知識分享 | R語言——大數據分析的一把利劍
    有些人問我是否應該學習在學R語言的同時學習Python。我的答案基本上是否定的,除非你需要使用一種以上的語言,否則你應該選擇一種語言進行學習。專注於一種程式語言的原因是,你需要更多地關注過程和技術,而不是語法。你需要掌握如何通過數據科學工具來分析數據,以及如何解決問題。事實證明,R語言是最佳的選擇。
  • 「數據分析」的理念、流程、方法、工具
    >(一) 數據驅動企業運營 從電商平臺的「猜你喜歡」到音樂平臺的「心動模式」,大數據已經滲透到了我們生活的每一個場景。根據實際工作需要,「報告」不一定是必須的,數據分析的結果是為了下一步的行動計劃作支撐。
  • 擁有「數據分析」+「數據可視化」能力,更能受到社會偏愛?
    數據分析其實是時代下的產物,隨著大數據的應用,數據分析可以幫助企業了解到自身的情況和行業環境,輔助進行風險評判與決策,那麼數據分析員/師賦予的分析報告的價值,才是對企業最有用的。乍一聽『數據分析』,無論是從名頭上,還是從工作內容上,都感覺很高大上。
  • 資源| 最流行的機器學習R語言軟體包是哪些?
    選自kdnuggets作者:Michael Li 、Paul Paczuski機器之心編譯參與:王宇欣、杜夏德The Data Incubator 中,有著最新的數據科學(data science)課程。其中大部分的課程都是基於企業和政府合作夥伴的需求而設立的。
  • Gartner預測2019年十大「數據和分析技術」趨勢:增強型分析成為...
    增強型數據分析,增強型數據管理,持續型智能,可解釋的 AI,數據結構,NLP/對話式分析,商業 AI 和 ML,區塊鏈和持久性內存伺服器共同構成了 Gartner 2019 年十大「數據和分析技術趨勢」。 最近兩天裡,2 月 18 日-19 日,在雪梨舉行的 Gartner 數據與分析峰會上,增強型數據分析和可解釋的人工智慧成為焦點。
  • Python數據分析基礎之NumPy學習 (上)
    數組計算之 NumPy (上)數組計算之 NumPy (下)科學計算之 SciPy數據結構之 Pandas基本可視化之 Matplotlib統計可視化之 Seaborn交互可視化之 Bokeh炫酷可視化之 PyEcharts
  • 使用R語言劍指商業數據分析
    而國內如經管之家論壇-五區 【R語言論壇】等都是優秀的R語言社區。如何系統學習和進階R語言數據分析?CDA數據分析集訓班R語言方向開課歡迎參加!數據是資訊時代的「新能源」。R SQL01-01商業數據分析與行業介紹01-02使用R演示數據分析全流程01-03R語言數據類型與數據結構01-04R語言程序控制與函數01-05SQL語言與R SQL實現01-06使用SQL進行數據匯總01-07使用ggplot進行基礎繪圖01-08案例:汽車行業貸款違約預測
  • 沃林老師「數據挖掘」答疑 18 問
    至於幾個 G 的情況大多數是晶片的 CEL 文件了,這類數據建議直接通過 GEO2R 進行分析。問題 2 :GEO 資料庫平臺文件裡沒有「gene. symbol」信息,怎麼解決呢?回  答:如果是晶片測序的話可以直接搜索晶片對應版本的注釋信息,如果是高通量測序的話找個在線 ID 轉換工具就可以解決了,比如「webgenestalt」或者 R 包「clusterprofiler」。