我正在编写一个R脚本,使用glm.nb测试150,000个遗传标记与连续变量的关联
我写了以下内容来做到这一点:
fhandle<-file("ichip_nb_model.csv","a")
for (i in seq(7, ncol(ICHPdt), 1)) {
glmmod<-glm.nb(OverllTot0 ~ EurAdmix + Sex + DisDurMonths + BMI + Group + SmokingStatus + eval(parse(text = paste("ICHPdt$", colnames(ICHPdt)[i], sep=""))), data=covfiledt)
writeLines(capture.output(coef(summary(glmmod))), con=fhandle)
writeLines(colnames(ICHPdt)[i], con=fhandle)
}
但是,这会导致问题。在第一个writeLines语句中写入的输出不包含列名,而是包含整个eval
表达式(请参阅下面的“当前输出”部分)。但是我不想要eval表达式,我想要评估的内容,因为列标题是被测试的遗传标记的名称。
所以,作为一个止损,我添加了第二个writeLines语句,但我更愿意找到一个解决方案,只会导致显示变体的名称。 脚本生成的输出格式如下:
当前输出
Estimate Std. Error z value
(Intercept) -0.960341597 0.898711395 -1.0685762
EurAdmix 2.055048065 1.132148532 1.8151753
Sex 0.783616302 0.369298081 2.1219073
DisDurMonths -0.013458018 0.002786449 -4.8298098
BMI -0.008077163 0.012892372 -0.6265071
Group -0.059876340 0.288834615 -0.2073032
SmokingStatus -0.089029296 0.185598042 -0.4796888
eval(parse(text = paste("ICHPdt$", colnames(ICHPdt)[i], sep = ""))) -0.108334664 0.169464866 -0.6392751
Pr(>|z|)
(Intercept) 2.852607e-01
EurAdmix 6.949697e-02
Sex 3.384552e-02
DisDurMonths 1.366635e-06
BMI 5.309824e-01
Group 8.357731e-01
SmokingStatus
6.314487e-01
eval(parse(text = paste("ICHPdt$", colnames(ICHPdt)[i], sep = ""))) 5.226440e-01
期望的输出:
Estimate Std. Error z value
(Intercept) -0.960341597 0.898711395 -1.0685762
EurAdmix 2.055048065 1.132148532 1.8151753
Sex 0.783616302 0.369298081 2.1219073
DisDurMonths -0.013458018 0.002786449 -4.8298098
BMI -0.008077163 0.012892372 -0.6265071
Group -0.059876340 0.288834615 -0.2073032
SmokingStatus -0.089029296 0.185598042 -0.4796888
ICHPdt$rs728931
-0.108334664 0.169464866 -0.6392751
Pr(>|z|)
(Intercept) 2.852607e-01
EurAdmix 6.949697e-02
Sex 3.384552e-02
DisDurMonths 1.366635e-06
BMI 5.309824e-01
Group 8.357731e-01
SmokingStatus 6.314487e-01
ICHPdt$rs728931
5.226440e-01
答案 0 :(得分:1)
几乎没有必要使用eval(parse())
。在这种情况下,将公式构建为字符串然后将其发送到调用将更容易。我假设您正在使用glm.nb()
包中的MASS
功能。这是动态构建公式
library(MASS)
other <- data.frame(matrix(runif(nrow(quine)*3), nrow=nrow(quine)))
lapply(names(other), function(x) {
ff<-as.formula(paste0("Days ~ Sex/(Age + Eth*Lrn) + other$", x))
glm.nb(ff, data = quine)
})
尽管如此,从一个不同的数据集中获取一些值并不是一个好主意。公式中的$
通常是一个不好的标志。您可以考虑将额外的协变量数据合并到data.frame中。在这里,我还展示了使用bquote()
lapply(names(other), function(x) {
glm.nb(bquote(Days ~ Sex/(Age + Eth*Lrn) + .(as.name(x))),
data = cbind(quine, other))
})
答案 1 :(得分:1)
summary.glm(fit)$ coefficient的结果是您想要的,将第8个rowname的名称更改为所需的字符值会很简单。也许使用write.table
可以节省capture.output
强加的一些笨拙(当然,除非你真的希望用&#39; Pr(&gt; | t |)&#进行环绕。 39;名称值:
fhandle<-file("ichip_nb_model.csv","a")
for (i in seq(7, ncol(ICHPdt), 1)) {
glmmod<-glm.nb(OverllTot0 ~ EurAdmix + Sex + DisDurMonths + BMI + Group + SmokingStatus + eval(parse(text = paste("ICHPdt$", colnames(ICHPdt)[i], sep=""))), data=covfiledt)
summ <- coef(summary(glmmod)))
rownames(summ)[8] <- paste0("ICHPdt$", colnames(ICHPdt)[i])
write.table( round(summ, 4) file=fhandle)
}