答读者问:R语言批量做一元线性回归的简单小例子
2023-02-22 本文已影响0人
小明的数据分析笔记本
有人在公众号的后台留言问到
他的数据如下,
image.png第一列是自变量,后面每一列是因变量,先算每一列和第一列的回归系数,有很多个这样的文件,如果用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)
image.png
我这个数据是随便够早的,所以系数都一样
那假如有好多个文件的话,首先把所有数据文件里的固定的那一列的列名都改成一样的,比如我的数据里就全是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()
最终输出结果
image.png这里我用的数据都一样,所以结果系数都是一样的,换成你自己的数据应该不是这样的
完整代码
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")
image.png
可能会遇到这个信息,可以忽略
示例数据和代码可以给推文点赞,然后点击在看,最后留言获取
欢迎大家关注我的公众号
小明的数据分析笔记本
小明的数据分析笔记本 公众号 主要分享:1、R语言和python做数据分析和数据可视化的简单小例子;2、园艺植物相关转录组学、基因组学、群体遗传学文献阅读笔记;3、生物信息学入门学习资料及自己的学习笔记!
微信公众号好像又有改动,如果没有将这个公众号设为星标的话,会经常错过公众号的推文,个人建议将 小明的数据分析笔记本 公众号添加星标,添加方法是