答讀者問:R語言批量做一元線性迴歸的簡單小例子

有人在公衆號的後臺留言問到

他的數據如下,

第一列是自變量,後面每一列是因變量,先算每一列和第一列的迴歸係數,有很多個這樣的文件,如果用R語言批量來做怎們實現

想了一下,應該還挺有用的,我寫了一個循環函數

batch_lm<-function(df,var,axis){
  x <- c()
  y <- c()
  z <- c()
  var1 <- df %>% pull(var)
  new.df <- df %>% select(-var)
  for (var2 in colnames(new.df)){
    if(axis==1){
      df.lm<-lm(new.df %>% pull(var2) ~ var1)
      x<-append(x,var)
      y<-append(y,var2)
      z<-append(z,df.lm$coefficients[2] %>% as.vector())
    }
    else{
      df.lm<-lm(var1 ~ new.df %>% pull(var2))
      x<-append(x,var)
      y<-append(y,var2)
      z<-append(z,df.lm$coefficients[2] %>% as.vector())
    }
    
  }
  return(data.frame(var1=x,var2=y,coef_value=z))
}

總共有三個參數,

  • 第一個df是讀取進來的數據集
  • 第二個var是想要固定的列的名字
  • 第三個參數axis取值是1和2,1代表固定的列是自變量,2代表固定的列是因變量

最後返回一個數據框

使用這個函數之前要加載tidyverse這個R包

比如讀取開頭的示例數據計算迴歸係數

library(tidyverse)
df<-read.csv("lm_example.csv")
batch_lm(df,"hours",axis=1)

我這個數據是隨便夠早的,所以係數都一樣

那假如有好多個文件的話,首先把所有數據文件裏的固定的那一列的列名都改成一樣的,比如我的數據裏就全是hours,然後把所有數據集都放到同一個文件夾下,比如我放到文件夾lmExamples下,我這邊是csv文件

代碼

csvfiles<-list.files("lmExamples/",
           pattern = "*.csv",
           full.names = TRUE)

final_results<-list()

for(csvfile in csvfiles){
  df<-read.csv(csvfile)
  final_df<-batch_lm(df,'hours',axis = 1)%>% mutate(new_col=csvfile)

  final_results[[csvfile]]<-final_df
}
final_results %>% bind_rows()

最終輸出結果

這裏我用的數據都一樣,所以結果係數都是一樣的,換成你自己的數據應該不是這樣的

完整代碼

library(tidyverse)
batch_lm<-function(df,var,axis){
  x <- c()
  y <- c()
  z <- c()
  var1 <- df %>% pull(var)
  new.df <- df %>% select(-var)
  for (var2 in colnames(new.df)){
    if(axis==1){
      df.lm<-lm(new.df %>% pull(var2) ~ var1)
      x<-append(x,var)
      y<-append(y,var2)
      z<-append(z,df.lm$coefficients[2] %>% as.vector())
    }
    else{
      df.lm<-lm(var1 ~ new.df %>% pull(var2))
      x<-append(x,var)
      y<-append(y,var2)
      z<-append(z,df.lm$coefficients[2] %>% as.vector())
    }
    
  }
  return(data.frame(var1=x,var2=y,coef_value=z))
}

df<-read("lmExamples/lm_example.csv")
batch_lm(df,'hours',axis = 1)
batch_lm(df,'hours',axis = 2)



csvfiles<-list.files("lmExamples/",
           pattern = "*.csv",
           full.names = TRUE)

final_results<-list()

for(csvfile in csvfiles){
  df<-read.csv(csvfile)
  final_df<-batch_lm(df,'hours',axis = 1)%>% mutate(new_col=csvfile)

  final_results[[csvfile]]<-final_df
}
final_results %>% bind_rows()

final_results %>% bind_rows() %>% write_csv(file="output.csv")

可能會遇到這個信息,可以忽略

示例數據和代碼可以給推文點贊,然後點擊在看,最後留言獲取

歡迎大家關注我的公衆號

小明的數據分析筆記本

小明的數據分析筆記本 公衆號 主要分享:1、R語言和python做數據分析和數據可視化的簡單小例子;2、園藝植物相關轉錄組學、基因組學、羣體遺傳學文獻閱讀筆記;3、生物信息學入門學習資料及自己的學習筆記!

微信公衆號好像又有改動,如果沒有將這個公衆號設爲星標的話,會經常錯過公衆號的推文,個人建議將 小明的數據分析筆記本 公衆號添加星標,添加方法是

點開公衆號的頁面,右上角有三個點

點擊三個點,會跳出界面

直接點擊 設爲星標 就可以了

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