-1

I want to write a loop on R to perform linear regression on my dataset genes (= 210011 genes and 6 samples total; with columns the gene and the rows the samples) to identify how age and sex affect gene expression. I want to save the fitted value output from the linear regression in a new dataframe (generating basically a similar dataframe where on the columns there are the genes and in the rows the samples).

so the loop I wrote is:

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

but I am not able to save a new dataframe. I tried to follow this How to Loop/Repeat a Linear Regression in 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) 
}

but it gives me "list of 0" as results so I must have written something wrong. How can I modif my original code generating a new dataframe with the results?

thanks for help help!

cb_1990
  • 3
  • 1

2 Answers2

1

Create a vector of column names instead of column values. Try the following :

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) 
}
Ronak Shah
  • 355,584
  • 18
  • 123
  • 178
1

Here's an example that works:

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


DaveArmstrong
  • 11,680
  • 1
  • 10
  • 21