-1

我想在 R 上编写一个循环来对我的数据集基因(= 210011 个基因和总共 6 个样本;列是基因,行是样本)执行线性回归,以确定年龄和性别如何影响基因表达。我想将线性回归的拟合值输出保存在一个新的数据框中(基本上生成一个类似的数据框,其中列上有基因,行中有样本)。

所以我写的循环是:

genelist <- df %>% select(5:21011) #select only genes
for (i in 1:length(genelist)) {
  formula <- as.formula(paste0(genelist[i], ' ~ age + sex'))
  model <- lm(formula, data = df)
  print(model$fitted.values)
}

但我无法保存新的数据框。我试图按照这个如何在 R 中循环/重复线性回归

test <- list(); model <- list()
for (i in 1:length(genelist)) {
  formula[[i]] = paste0(genelist[i], ' ~ age + sex')
  model[[i]] = lm(formula[[i]], data = df) 
}

但它给了我“0列表”作为结果,所以我一定写错了。如何修改我的原始代码生成一个新的数据框的结果?

感谢您的帮助!

4

2 回答 2

1

创建列名向量而不是列值。尝试以下操作:

names_vec <- names(genelist)
formula <- vector('list', length(names_vec))
model <- vector('list', length(names_vec))

for (i in seq_along(names_vec)) {
  formula[[i]] = paste0(genelist[i], ' ~ age + sex')
  model[[i]] = lm(formula[[i]], data = df) 
}
于 2021-03-06T13:36:51.697 回答
1

这是一个有效的示例:

set.seed(2053)
df <- data.frame(age = sample(18:80, 6, replace=FALSE), 
                 sex = sample(0:1, 6, replace=TRUE))
for(i in 1:10){
  df[[paste0("gene_", i)]] <- runif(6,0,1)
}
                
genelist <- df %>% select(3:12) #select only genes
pred <- df %>% select(age, sex)
for (i in 1:length(genelist)) {
  formula <- reformulate(c("age", "sex"), response=names(genelist)[i])  
  model <- lm(formula, data = df)
  pred[[names(genelist)[i]]] <- predict(model, newdata=pred)
}
pred
#   age sex    gene_1    gene_2      gene_3    gene_4      gene_5    gene_6
# 1  54   0 0.6460394 0.7975062 0.542963150 0.5766314  0.43716321 0.3731399
# 2  65   0 0.4969311 0.7557411 0.499976012 0.7201710 -0.02954846 0.3392473
# 3  49   0 0.7138160 0.8164903 0.562502758 0.5113862  0.64930488 0.3885457
# 4  62   0 0.5375970 0.7671316 0.511699777 0.6810238  0.09773654 0.3484907
# 5  44   0 0.7815925 0.8354744 0.582042366 0.4461409  0.86144655 0.4039515
# 6  40   1 0.3976764 0.3673542 0.009429805 0.2500409  0.38185899 0.5017752
#      gene_7    gene_8     gene_9   gene_10
# 1 0.6990817 0.6336038 0.36330413 0.3146205
# 2 0.6414371 0.8336259 0.58575121 0.2651734
# 3 0.7252838 0.5426847 0.26219181 0.3370964
# 4 0.6571584 0.7790744 0.52508383 0.2786590
# 5 0.7514859 0.4517656 0.16107950 0.3595723
# 6 0.1903702 0.9501972 0.09472406 0.6118369


于 2021-03-06T13:40:27.977 回答