如何在R中每次循环使用不同变量的命令集?

时间:2015-08-18 10:35:09

标签: r regression

我对 R 编码很新,因此我真的需要你的帮助才能在 R 中运行循环命令。

我有一个大表(" 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

问题1: 有人可以帮助我如何执行上述命令,并使用下一个变量(从var1到var2,再到var3,直到var200)再次重复它们,而不必单独运行它。

问题2: 如何将每个运行结果编译成一个编译表?

3 个答案:

答案 0 :(得分:1)

最简单的方法是对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=""))])

关于将输出保存到表中,首先必须确定要保存的输出部分(例如系数)

mytab <- matrix(NA, 2, 3)
for (i in 1:2)
  mytab[i, ] <- out[[i]]$coefficients

您还可以使用broom库从lm个对象中提取“整洁”的输出。

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组合这些输出。

答案 1 :(得分:0)

您可以尝试这样的事情:

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'指令,但其余部分类似:您将代码粘贴到字符串中,然后使用'eval(parse(text =))'执行它。

在此之后你可以访问变量'lm.V1',...'lm.V200'

答案 2 :(得分:0)

如果您首先重新排列数据框,那么您将更容易使用数据框:

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)

您最终会得到一个包含五列的表xsampleBMIvarvar1,{ {1}}等),var2LRR。它的行数是当前表的200倍。请注意,使用BAF运算符,您可以执行以下步骤:

%>%

完成重新排列后,您可以使用dplyr&#39; s library(dplyr) tidied <- dataset %>% gather(var, value, -sample, -BMI) %>% separate(var, c("var", "variable")) %>% spread(variable, value) group_by以及扫帚轻松地在每个变量中执行线性回归:

do

例如,如果您的数据集是:

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))