如何在 R 中每次循环使用不同变量的命令集?
How to loop set of commands with different variable each time in R?
我对 R 编码很陌生,因此我真的需要你的帮助 运行 R 中的循环命令.
我有一个很大的 table ("variable_table.txt"),列如下:
sample BMI var1_LRR var1_BAF var2_LRR var2_BAF var3_LRR var3_BAF ........ var200_LRR var200_BAF
AA 18.9 0.27 0.99 0.18 0.99 0.11 1 ........ 0.20 0.99
BB 27.1 0.23 1 0.13 0.99 0.17 1 ........ 0.23 0.99
我想运行一个回归命令如下:
dataset<- read.table ("variable_table.txt", na.strings="NA", header=TRUE)
linear_var1 <- lm (BMI ~ var1_LRR + var1_BAF,data=dataset)
summary(linear_var1)
confint_var1_CI <- confint(linear _var1, level=0.95)
confint_var_CI
问题一:
有人可以帮助我如何执行上述命令,并使用下一个变量(从 var1 到 var2,然后到 var3,直到 var200)再次重复它们,而不必单独 运行 它。
问题二:
如何将每个 运行 结果编译成一个编译的 table?
您可以尝试这样的操作:
for ( i in 1:200 ) {
# build the formula
form<-as.formula(paste("BMI ~ **var", i, "**_LRR + **var", i, "**_BAF", sep=""))
# make a character string with the lm-instruction, using the formula above
code.lm<-paste("lm.V", i, "<-lm(form, data=dataset)", sep="")
# dynamically execute the code in that string
eval(parse(text=code.lm))
# create a string xith the summary code
code.summ<-paste("summary(lm.V", i, ")", sep="")
# dynamically execute the string
eval(parse(text=code.summ))
}
我做到了 'summary' 指令,但其余类似:你 'paste' 你的代码在一个字符串中,然后用 'eval(parse(text=))' 执行它。
之后您可以访问变量 'lm.V1', ... 'lm.V200'
最简单的方法是对 data.frame 进行子集化,例如
mydata <- data.frame(y = runif(100),
foo1 = runif(100), bar1 = runif(100),
foo2 = runif(100), bar2 = runif(100))
out <- list()
for (i in 1:2)
out[[i]] <- lm(y ~., data = mydata[, c("y", paste(c("foo", "bar"), i, sep=""))])
关于将输出保存到 table,首先你必须决定要保存输出的哪一部分(例如系数)
mytab <- matrix(NA, 2, 3)
for (i in 1:2)
mytab[i, ] <- out[[i]]$coefficients
您还可以使用 broom 库从 lm
个对象中提取 "tidy" 输出。
library(broom)
tidy(out[[1]])
## term estimate std.error statistic p.value
## 1 (Intercept) 0.5060922 0.07619095 6.642419 0.000000001794162
## 2 foo1 -0.1567166 0.10023700 -1.563461 0.121201059993118
## 3 bar1 0.1578192 0.10404012 1.516907 0.132542574934363
接下来,您可以使用 rbind
.
组合这些输出
如果您先重新排列数据框,您将可以更轻松地使用它:
library(tidyr)
# gather all columns into a single column
tidied <- gather(dataset, var, value, -sample, -BMI)
# separate the "var" column into varnum (var1, var2...) and variable
tidied <- separate(tidied, var, c("var1", "variable"))
# now spread the two variables (BAF and LRR) back across columns
tidied <- spread(tidied, variable, value)
您最终会得到一个包含五列的 table x
:sample
、BMI
、var
(即 var1
、var2
、等等)、LRR
和 BAF
。它的行数将是当前 table 的 200 倍。请注意,使用 %>%
运算符,您可以按照以下步骤执行上述步骤:
library(dplyr)
tidied <- dataset %>%
gather(var, value, -sample, -BMI) %>%
separate(var, c("var", "variable")) %>%
spread(variable, value)
完成重新排列后,您可以使用 dplyr 的 group_by
和 do
以及 broom:
非常轻松地在每个变量内执行线性回归
library(broom)
coefs <- tidied %>%
group_by(var) %>%
do(tidy(lm(BMI ~ BAF + LRR, data = .), conf.int = TRUE))
例如,如果您的数据集是:
set.seed(1)
dataset <- data.frame(sample = 1:100, BMI = rnorm(100),
var1_LRR = rnorm(100), var1_BAF = runif(100),
var2_LRR = rnorm(100), var2_BAF = runif(100),
var3_LRR = rnorm(100), var3_BAF = runif(100))
以上代码的结果为:
Source: local data frame [9 x 8]
Groups: var
var term estimate std.error statistic p.value conf.low conf.high
1 var1 (Intercept) 0.1298513867 0.17715588 0.732978145 0.4653394 -0.22175399 0.4814568
2 var1 BAF -0.0415096698 0.30068830 -0.138048836 0.8904880 -0.63829271 0.5552734
3 var1 LRR 0.0001270982 0.09550805 0.001330759 0.9989409 -0.18942994 0.1896841
4 var2 (Intercept) 0.1064316834 0.18173583 0.585639517 0.5594779 -0.25426363 0.4671270
5 var2 BAF 0.0144181386 0.31656921 0.045544981 0.9637666 -0.61388410 0.6427204
6 var2 LRR -0.0470190629 0.09340229 -0.503403723 0.6158217 -0.23239676 0.1383586
7 var3 (Intercept) 0.0616288934 0.17865709 0.344956329 0.7308741 -0.29295597 0.4162138
8 var3 BAF 0.1045320710 0.31246736 0.334537572 0.7386962 -0.51562914 0.7246933
9 var3 LRR 0.1118595808 0.07714709 1.449952134 0.1502976 -0.04125603 0.2649752
我对 R 编码很陌生,因此我真的需要你的帮助 运行 R 中的循环命令.
我有一个很大的 table ("variable_table.txt"),列如下:
sample BMI var1_LRR var1_BAF var2_LRR var2_BAF var3_LRR var3_BAF ........ var200_LRR var200_BAF
AA 18.9 0.27 0.99 0.18 0.99 0.11 1 ........ 0.20 0.99
BB 27.1 0.23 1 0.13 0.99 0.17 1 ........ 0.23 0.99
我想运行一个回归命令如下:
dataset<- read.table ("variable_table.txt", na.strings="NA", header=TRUE)
linear_var1 <- lm (BMI ~ var1_LRR + var1_BAF,data=dataset)
summary(linear_var1)
confint_var1_CI <- confint(linear _var1, level=0.95)
confint_var_CI
问题一: 有人可以帮助我如何执行上述命令,并使用下一个变量(从 var1 到 var2,然后到 var3,直到 var200)再次重复它们,而不必单独 运行 它。
问题二: 如何将每个 运行 结果编译成一个编译的 table?
您可以尝试这样的操作:
for ( i in 1:200 ) {
# build the formula
form<-as.formula(paste("BMI ~ **var", i, "**_LRR + **var", i, "**_BAF", sep=""))
# make a character string with the lm-instruction, using the formula above
code.lm<-paste("lm.V", i, "<-lm(form, data=dataset)", sep="")
# dynamically execute the code in that string
eval(parse(text=code.lm))
# create a string xith the summary code
code.summ<-paste("summary(lm.V", i, ")", sep="")
# dynamically execute the string
eval(parse(text=code.summ))
}
我做到了 'summary' 指令,但其余类似:你 'paste' 你的代码在一个字符串中,然后用 'eval(parse(text=))' 执行它。
之后您可以访问变量 'lm.V1', ... 'lm.V200'
最简单的方法是对 data.frame 进行子集化,例如
mydata <- data.frame(y = runif(100),
foo1 = runif(100), bar1 = runif(100),
foo2 = runif(100), bar2 = runif(100))
out <- list()
for (i in 1:2)
out[[i]] <- lm(y ~., data = mydata[, c("y", paste(c("foo", "bar"), i, sep=""))])
关于将输出保存到 table,首先你必须决定要保存输出的哪一部分(例如系数)
mytab <- matrix(NA, 2, 3)
for (i in 1:2)
mytab[i, ] <- out[[i]]$coefficients
您还可以使用 broom 库从 lm
个对象中提取 "tidy" 输出。
library(broom)
tidy(out[[1]])
## term estimate std.error statistic p.value
## 1 (Intercept) 0.5060922 0.07619095 6.642419 0.000000001794162
## 2 foo1 -0.1567166 0.10023700 -1.563461 0.121201059993118
## 3 bar1 0.1578192 0.10404012 1.516907 0.132542574934363
接下来,您可以使用 rbind
.
如果您先重新排列数据框,您将可以更轻松地使用它:
library(tidyr)
# gather all columns into a single column
tidied <- gather(dataset, var, value, -sample, -BMI)
# separate the "var" column into varnum (var1, var2...) and variable
tidied <- separate(tidied, var, c("var1", "variable"))
# now spread the two variables (BAF and LRR) back across columns
tidied <- spread(tidied, variable, value)
您最终会得到一个包含五列的 table x
:sample
、BMI
、var
(即 var1
、var2
、等等)、LRR
和 BAF
。它的行数将是当前 table 的 200 倍。请注意,使用 %>%
运算符,您可以按照以下步骤执行上述步骤:
library(dplyr)
tidied <- dataset %>%
gather(var, value, -sample, -BMI) %>%
separate(var, c("var", "variable")) %>%
spread(variable, value)
完成重新排列后,您可以使用 dplyr 的 group_by
和 do
以及 broom:
library(broom)
coefs <- tidied %>%
group_by(var) %>%
do(tidy(lm(BMI ~ BAF + LRR, data = .), conf.int = TRUE))
例如,如果您的数据集是:
set.seed(1)
dataset <- data.frame(sample = 1:100, BMI = rnorm(100),
var1_LRR = rnorm(100), var1_BAF = runif(100),
var2_LRR = rnorm(100), var2_BAF = runif(100),
var3_LRR = rnorm(100), var3_BAF = runif(100))
以上代码的结果为:
Source: local data frame [9 x 8]
Groups: var
var term estimate std.error statistic p.value conf.low conf.high
1 var1 (Intercept) 0.1298513867 0.17715588 0.732978145 0.4653394 -0.22175399 0.4814568
2 var1 BAF -0.0415096698 0.30068830 -0.138048836 0.8904880 -0.63829271 0.5552734
3 var1 LRR 0.0001270982 0.09550805 0.001330759 0.9989409 -0.18942994 0.1896841
4 var2 (Intercept) 0.1064316834 0.18173583 0.585639517 0.5594779 -0.25426363 0.4671270
5 var2 BAF 0.0144181386 0.31656921 0.045544981 0.9637666 -0.61388410 0.6427204
6 var2 LRR -0.0470190629 0.09340229 -0.503403723 0.6158217 -0.23239676 0.1383586
7 var3 (Intercept) 0.0616288934 0.17865709 0.344956329 0.7308741 -0.29295597 0.4162138
8 var3 BAF 0.1045320710 0.31246736 0.334537572 0.7386962 -0.51562914 0.7246933
9 var3 LRR 0.1118595808 0.07714709 1.449952134 0.1502976 -0.04125603 0.2649752