我对 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: 如何将每个运行结果编译成一个编译表?
答案 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)
您最终会得到一个包含五列的表x
:sample
,BMI
,var
(var1
,{ {1}}等),var2
和LRR
。它的行数是当前表的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))