簡體   English   中英

如何使用R在單個新數據框中輸出多個模型的殘差?

[英]How can I output residuals from multiple models in a single new data frame using R?

我想針對多個不同的因變量為一組靜態的獨立變量運行多個回歸模型,並將殘差輸出到一個看起來像...的新文件中。

SampleID     site_residual1    site_residual2    site_residual3
F001         0.003             0.988             0.776
F001         0.002             0.876             0.665
F002         0.134             0.234             0.786
...

我一直在使用以下代碼來獲取單個殘差輸出,但是未能實現將在我所有站點上運行的循環。

infile = sprintf("/path/siteinput.txt.gz")

infile看起來像...

SampleID     site1  site2   site3   etc...
F001         0.003  0.988   0.776   etc...
F001         0.002  0.876   0.665   etc...
F002         0.134  0.234   0.786   etc...
...

...

pheno = read.table("/path/pheno_covar.txt", header=T, sep="\t")

現象看起來像...

SampleID     indep1 indep2  indep3  chip1   etc...
F001         0.003  0.988   0.776   2       etc...
F001         0.002  0.876   0.665   2       etc...
F002         0.134  0.234   0.786   1       etc...
...

...

residfile = sprintf("/path/test_resid_out.txt")

library(lme4)

beta = read.table(infile, header=T, sep="\t")

merged = merge(beta, pheno, by="SampleID")

site<-merged$site1
chip <- as.factor(merged$chip1)

model1 <- lmer (formula= site ~ indep1 +indep2 + indep3 + (1|chip), data=merged)

print(summary(model1))
print(resid(model1))

site1_resid = resid(model1, na.action=na.exclude)

residout<-(data.frame(SampleID, site1_resid))
write.table(residout, file=residfile, sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE)

我的輸出看起來像...

SampleID    site1_resid
F001        0.0110177454696274
F002        0.0923483180517723
F003        0.103686493563883
F004        -0.106193404096636
F005        -0.124621172636435
....

...

因此,我確實在尋找一種方法來為“ infile”中的每個站點運行model1並將所有殘差輸出到一個新文件中。 另外,我想讓列標題包含“站點”的原始名稱。 我確實有一些缺失的信息(所有協變量都完整,但是某些ID缺少某些站點)。

任何意見,將不勝感激。

借助magrittr管道( %>% )使其更易於閱讀(盡管不是必需的):

library(magrittr)
names(beta) %>% 
  setdiff("SampleID") %>% 
  setNames(., .) %>% 
  lapply(function(x) {
    model <- lmer(data = merged, formula = paste(x, "~ indep1 +indep2 + indep3 + (1|chip)"))
    # print(summary(model))
    # print(resid(model))
    resid(model, na.action=na.exclude)
  }) %>% 
  c(list(SampleID = merged$SampleID), .) %>% 
  do.call(what = "data.frame")

(在旁注中,讓我擔心的是您有重復的SampleID 。這是故意的嗎?如果是,您確定要通過SampleID進行merge()嗎?您是否寧願使用cbind(beta, pheno[, - 1, drop = FALSE])嗎?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM