web-dev-qa-db-ja.com

Rで線形回帰をループ/繰り返す方法

Rで4つの変数を持つテーブルを作成する方法を理解しました。これは、複数の線形回帰に使用しています。各回帰の従属変数(Lung)は、22,000列のcsvテーブルの1列から取得されます。独立変数の1つ(血液)は、同様のテーブルの対応する列から取得されます。各列は特定の遺伝子のレベルを表しています。そのため、それらの遺伝子の数は非常に多くなっています。 2つの追加変数もあります(各患者の年齢と性別)。線形回帰方程式を入力するときは、1つの遺伝子に対して機能するlm(Lung [、1]〜Blood [、1] + Age + Gender)を使用します。この方程式を入力し、Rに肺と血液の残りの列をすべて計算させ、係数を表に出力する方法を探しています。何か助けていただければ幸いです!

7
JHall1020

22,000の線形回帰を実行して係数を抽出しますか?これは、コーディングの観点からは簡単です。

set.seed(1)

# number of columns in the Lung and Blood data.frames. 22,000 for you?
n <- 5 

# dummy data
obs <- 50 # observations
Lung <- data.frame(matrix(rnorm(obs*n), ncol=n))
Blood <- data.frame(matrix(rnorm(obs*n), ncol=n))
Age <- sample(20:80, obs)
Gender  <- factor(rbinom(obs, 1, .5))

# run n regressions
my_lms <- lapply(1:n, function(x) lm(Lung[,x] ~ Blood[,x] + Age + Gender))

# extract just coefficients
sapply(my_lms, coef)

# if you need more info, get full summary call. now you can get whatever, like:
summaries <- lapply(my_lms, summary)
# ...coefficents with p values:
lapply(summaries, function(x) x$coefficients[, c(1,4)])
# ...or r-squared values
sapply(summaries, function(x) c(r_sq = x$r.squared, 
                                adj_r_sq = x$adj.r.squared))

モデルはリストに保存され、モデル3(DV Lung [、3]およびIVs Blood [、3] + Age + Genderを含む)はmy_lms[[3]] 等々。リストの適用機能を使用して、必要な数値を抽出できる要約を実行できます。

13
arvi1000

問題は、ループ内で変更された数式を使用して回帰関数を呼び出す方法についてのようです。

(ダイヤモンドデータセットを使用して)これを行う方法は次のとおりです。

attach(ggplot2::diamonds)
strCols = names(ggplot2::diamonds)

formula <- list(); model <- list()
for (i in 1:1) {
  formula[[i]] = paste0(strCols[7], " ~ ", strCols[7+i])
  model[[i]] = glm(formula[[i]]) 

  #then you can plot or do anything else with the result ...
  png(filename = sprintf("diamonds_price=glm(%s).png", strCols[7+i]))
  par(mfrow = c(2, 2))      
  plot(model[[i]])
  dev.off()
  }
2
IVIM

賢明かどうかにかかわらず、ループを少なくとも何らかの方法で機能させるには、以下が必要です。

y<- c(1,5,6,2,5,10) # response 
x1<- c(2,12,8,1,16,17) # predictor 
x2<- c(2,14,5,1,17,17) 
predictorlist<- list("x1","x2") 
for (i in predictorlist){ 
  model <- lm(paste("y ~", i[[1]]), data=df) 
  print(summary(model)) 
} 

貼り付け機能は問題を解決します。

0
Sarwan Pasha