答读者问: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、生物信息学入门学习资料及自己的学习笔记!

微信公众号好像又有改动,如果没有将这个公众号设为星标的话,会经常错过公众号的推文,个人建议将 小明的数据分析笔记本 公众号添加星标,添加方法是

点开公众号的页面,右上角有三个点

点击三个点,会跳出界面

直接点击 设为星标 就可以了

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