如何 Loop/Repeat R 中的线性回归
How to Loop/Repeat a Linear Regression in R
我已经弄清楚如何使用 4 个变量在 R
中创建 table,我将其用于多元线性回归。每个回归的因变量 (Lung
) 取自 22,000 列的 csv table 的一列。其中一个自变量(Blood
)取自类似table.
的对应列
每一列代表一个特定基因的水平,这就是为什么有这么多。还有两个附加变量(每个患者的 Age
和 Gender
)。当我输入线性回归方程时,我使用 lm(Lung[,1] ~ Blood[,1] + Age + Gender)
,它适用于一个基因。
我正在寻找一种方法来输入这个方程式并让 R 计算 Lung
和 Blood
的所有剩余列,并希望将系数输出到 table。
如有任何帮助,我们将不胜感激!
您想 运行 22,000 个线性回归并提取系数?从编码的角度来看,这很容易做到。
set.seed(1)
# number of columns in the Lung and Blood data.frames. 22,000 for you?
n <- 5
# dummy data
obs <- 50 # observations
Lung <- data.frame(matrix(rnorm(obs*n), ncol=n))
Blood <- data.frame(matrix(rnorm(obs*n), ncol=n))
Age <- sample(20:80, obs)
Gender <- factor(rbinom(obs, 1, .5))
# run n regressions
my_lms <- lapply(1:n, function(x) lm(Lung[,x] ~ Blood[,x] + Age + Gender))
# extract just coefficients
sapply(my_lms, coef)
# if you need more info, get full summary call. now you can get whatever, like:
summaries <- lapply(my_lms, summary)
# ...coefficents with p values:
lapply(summaries, function(x) x$coefficients[, c(1,4)])
# ...or r-squared values
sapply(summaries, function(x) c(r_sq = x$r.squared,
adj_r_sq = x$adj.r.squared))
模型存储在列表中,其中模型 3(DV Lung[ 3] 和 IVs Blood[3] + 年龄 + 性别)在 my_lms[[3]]
中,依此类推。您可以使用列表上的应用函数来执行汇总,从中您可以提取您想要的数字。
问题似乎是关于如何使用在循环内修改的公式调用回归函数。
以下是您可以在(使用钻石数据集)中执行此操作的方法:
attach(ggplot2::diamonds)
strCols = names(ggplot2::diamonds)
formula <- list(); model <- list()
for (i in 1:1) {
formula[[i]] = paste0(strCols[7], " ~ ", strCols[7+i])
model[[i]] = glm(formula[[i]])
#then you can plot or do anything else with the result ...
png(filename = sprintf("diamonds_price=glm(%s).png", strCols[7+i]))
par(mfrow = c(2, 2))
plot(model[[i]])
dev.off()
}
明智与否,要使循环至少以某种方式工作,您需要:
y<- c(1,5,6,2,5,10) # response
x1<- c(2,12,8,1,16,17) # predictor
x2<- c(2,14,5,1,17,17)
predictorlist<- list("x1","x2")
for (i in predictorlist){
model <- lm(paste("y ~", i[[1]]), data=df)
print(summary(model))
}
粘贴功能可以解决问题
Tidyverse 添加 - 使用 map()
另一种方法 - 使用 purrr
包中的 map2()
:
library(purrr)
xs <- anscombe[,1:3] # Select variables of interest
ys <- anscombe[,5:7]
map2_df(ys, xs,
function(i,j){
m <- lm(i ~j + x4 , data = anscombe)
coef(m)
})
输出是所有系数的数据帧(tibble):
`(Intercept)` j x4
1 4.33 0.451 -0.0987
2 6.42 0.373 -0.253
3 2.30 0.526 0.0518
如果要更改更多变量,可以使用 pmap()
函数
我已经弄清楚如何使用 4 个变量在 R
中创建 table,我将其用于多元线性回归。每个回归的因变量 (Lung
) 取自 22,000 列的 csv table 的一列。其中一个自变量(Blood
)取自类似table.
每一列代表一个特定基因的水平,这就是为什么有这么多。还有两个附加变量(每个患者的 Age
和 Gender
)。当我输入线性回归方程时,我使用 lm(Lung[,1] ~ Blood[,1] + Age + Gender)
,它适用于一个基因。
我正在寻找一种方法来输入这个方程式并让 R 计算 Lung
和 Blood
的所有剩余列,并希望将系数输出到 table。
如有任何帮助,我们将不胜感激!
您想 运行 22,000 个线性回归并提取系数?从编码的角度来看,这很容易做到。
set.seed(1)
# number of columns in the Lung and Blood data.frames. 22,000 for you?
n <- 5
# dummy data
obs <- 50 # observations
Lung <- data.frame(matrix(rnorm(obs*n), ncol=n))
Blood <- data.frame(matrix(rnorm(obs*n), ncol=n))
Age <- sample(20:80, obs)
Gender <- factor(rbinom(obs, 1, .5))
# run n regressions
my_lms <- lapply(1:n, function(x) lm(Lung[,x] ~ Blood[,x] + Age + Gender))
# extract just coefficients
sapply(my_lms, coef)
# if you need more info, get full summary call. now you can get whatever, like:
summaries <- lapply(my_lms, summary)
# ...coefficents with p values:
lapply(summaries, function(x) x$coefficients[, c(1,4)])
# ...or r-squared values
sapply(summaries, function(x) c(r_sq = x$r.squared,
adj_r_sq = x$adj.r.squared))
模型存储在列表中,其中模型 3(DV Lung[ 3] 和 IVs Blood[3] + 年龄 + 性别)在 my_lms[[3]]
中,依此类推。您可以使用列表上的应用函数来执行汇总,从中您可以提取您想要的数字。
问题似乎是关于如何使用在循环内修改的公式调用回归函数。
以下是您可以在(使用钻石数据集)中执行此操作的方法:
attach(ggplot2::diamonds)
strCols = names(ggplot2::diamonds)
formula <- list(); model <- list()
for (i in 1:1) {
formula[[i]] = paste0(strCols[7], " ~ ", strCols[7+i])
model[[i]] = glm(formula[[i]])
#then you can plot or do anything else with the result ...
png(filename = sprintf("diamonds_price=glm(%s).png", strCols[7+i]))
par(mfrow = c(2, 2))
plot(model[[i]])
dev.off()
}
明智与否,要使循环至少以某种方式工作,您需要:
y<- c(1,5,6,2,5,10) # response
x1<- c(2,12,8,1,16,17) # predictor
x2<- c(2,14,5,1,17,17)
predictorlist<- list("x1","x2")
for (i in predictorlist){
model <- lm(paste("y ~", i[[1]]), data=df)
print(summary(model))
}
粘贴功能可以解决问题
Tidyverse 添加 - 使用 map()
另一种方法 - 使用 purrr
包中的 map2()
:
library(purrr)
xs <- anscombe[,1:3] # Select variables of interest
ys <- anscombe[,5:7]
map2_df(ys, xs,
function(i,j){
m <- lm(i ~j + x4 , data = anscombe)
coef(m)
})
输出是所有系数的数据帧(tibble):
`(Intercept)` j x4
1 4.33 0.451 -0.0987
2 6.42 0.373 -0.253
3 2.30 0.526 0.0518
如果要更改更多变量,可以使用 pmap()
函数