在高維數據分析過程中,為了篩選出與目標結局相關的變量,通常會用到回歸分析,但是因為自變量較多,往往要進行多次回歸。這就是統計編程語言發揮作用的時候了
有些大神們認為超過3次的復制粘貼就可以考慮使用循環了,當然個人“承受能力較強”,在分析過程中還是經常會用復制粘貼來解決相當一部分的問題。但是當變量太多需要多次復制粘貼,並且還要對不同的過程設置不同的編號真的太麻煩了。比如有100個X,就要命名100個模型,從fit1到fit100,顯然可操作性太差了。
所以循環必須派上用場,接下來將總結一下在R中使用循環來進行回歸分析的幾個常用方法。
我們以R自帶的state.x77數據集為例進行介紹。 由於原始數據集是矩陣,先轉變成數據框,再以一個簡單的名字命名。數據結構如下:
行代表50個不同的州,列是8個不同的變量:Population:人口數;Income:收入;Illiteracy:文盲率(百分比);Life Exp:期望壽命;Murder:凶殺案發生率(每10萬人);HS Grad:高中畢業率;Frost:氣溫低於冰凍的天數;Area:每平方英里的陸地面積。
我們以凶殺案發生率(Murder)為因變量,看哪些因素跟案件發生率有關。
1.根據變量所在的列號進行循環
開始循環之前先建立一個空的向量result1用以在循環過程中儲存提取的結果。
模型中states[,i]表示逐個選擇states數據框的第1-4個變量,進行線性回歸分析。
coef(summary(fit))[2,c(1,2,4)]用以提取目標變量回歸分析結果的beta,SE,和p值。提取之后通過colnames(states)[i]加上相應變量的變量名。最后在循環過程中通過rbind將結果合並在一個數據框result1中,結果如下:
可以通過write.csv()等函數將結果輸出到本地文件夾中。
這種循環方法適用於變量在數據框中是連續排列的。
2.根據變量名進行循環
如果目標變量在數據框中不是連續的,可以使用這個方法,先建立一個目標變量名的向量,然后在回歸方程中加上substitute函數,分別將提前建立的變量名替換到方程中,建立變量名的循環。
這里注意了:一定要使用substitute函數,不能直接將states[,as.name(vars[i])]放入方程中,有興趣的讀者可以查一下substitute函數的用法。
結果如下:
3.使用apply函數進行循環
先自定義一個線性回歸函數,可以直接提取出回歸結果中的beta,SE,和P值。然后用apply函數(也可以使用sapply等函數)將此自定義的函數分別使用於數據集選定的列。再通過轉置函數t( )使結果更具有可讀性。
結果如下:
該方法既適用於目標變量在數據框中是連續排列的,也適用於不連續排列的情況。
4.使用purrr包的map函數進行循環
該方法與apply族函數的思路相似,不同的是purrr包是Hardley大神tidyverse的核心包之一,速度非常快,特別適用於數據較大,變量較多的數據集。
同樣需要先自定義一個線性回歸函數,然后通過map函數適用於數據集選定的列。
得到結果如下:
發現不太適合直接導出,沒關系,加上as.data.frame和轉置函數t()就可以了,結果如下:
以上是在R語言中用循環做回歸分析的常用方法,其中有些細節可以根據自己的需要進行調整,比如提取結果中的其他變量。
這些循環方法也適用於其他回歸模型,比如常用的logistic回歸。另外我在自己的數據集中測試了不同方法的耗時情況,幾次測試map函數都是最省時的,for循環和apply函數在我的數據上表現相差不大。