R中glm的输出不包括变量名
output from glm in R does not include variable name
我正在编写一个 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 表达式,我想要 评估为 的内容,因为列 header 是正在测试的遗传标记的名称。
因此,作为 stop-gap,我添加了第二个 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
几乎不需要使用 eval(parse())
。在这种情况下,将公式构建为字符串然后将其发送到调用会更容易。我假设您正在使用 MASS
包中的 glm.nb()
函数。这是动态构建公式的示例
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))
})
summary.glm(fit)$coefficients 的结果就是您想要的结果,将第 8 个行名的名称更改为所需的字符值很简单。也许使用 write.table
会节省一些 capture.output
强加的笨拙(当然,除非你真的想要使用 'Pr(>|t|)' 名称值的环绕:
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)
}
我正在编写一个 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 表达式,我想要 评估为 的内容,因为列 header 是正在测试的遗传标记的名称。
因此,作为 stop-gap,我添加了第二个 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
几乎不需要使用 eval(parse())
。在这种情况下,将公式构建为字符串然后将其发送到调用会更容易。我假设您正在使用 MASS
包中的 glm.nb()
函数。这是动态构建公式的示例
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))
})
summary.glm(fit)$coefficients 的结果就是您想要的结果,将第 8 个行名的名称更改为所需的字符值很简单。也许使用 write.table
会节省一些 capture.output
强加的笨拙(当然,除非你真的想要使用 'Pr(>|t|)' 名称值的环绕:
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)
}