我正在尝试计算50多个SNP的Beta和标准误差以及它们对绝经年龄的个体影响。我的剧本不太对劲。我想使用country
作为共变量,并对绝经年龄(a_menopause
)和每个SNP进行线性回归。
当我通过SNP进行SNP计算时,我得到了正确的答案。这是我使用的命令:
rs <- lm(a_menopause~rs17465637_metabo + country, data="x")
summary(rs)
输出看起来像这样(我只对第二行(rs)感兴趣,特别是估计和标准错误:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 49.515274 0.340216 145.541 <2e-16 ***
rs -0.004258 0.171557 -0.025 0.980
RS$country 0.019684 0.047994 0.410 0.682
我现在有以下脚本尝试每次用新变量替换rs17465637_metabo。然而,当我查看我的输出时,所有值都非常相似(并且与我一次使用一个SNP时非常不同)。我也只得到(拦截)值而不是RS值。
这是我的剧本:
read.data <- function(file="RS.csv") {
x <- read.csv(file, sep=";", dec=",")
x$country <- factor(x$country)
x
}
## Fit the LMs
fit.lms <- function(x) {
rsid <- colnames(x)[-(1:3)] # all column names except the first three
res <- vector("list", length=length(rsid))
i <- 1
for (rs in rsid) {
modeltxt <- paste("lm(a_menopause ~ 0 + ", rsid, " + country, data=x)") # build model expression text
r <- eval(parse(text=modeltxt))
s <- summary(r)$coefficients
res[[i]] <- c(s[2,], s[2,])
i <- i+1
}
data.frame(do.call(rbind, res), rsid=rsid)
}
run <- function() {
x <- read.data()
lms <- fit.lms(x)
write.table(lms, file="fits.csv", sep=";", dec=",", row.names=F)
}
我哪里错了?如何更改输出以获得第二行数据?
提前致谢!
答案 0 :(得分:1)
不要use eval(parse())
而是as.formula(paste())
my.form <- as.formula(paste("a_menopause ~ 0 +", rs, "+ country")))
r <- lm(my.form, data=x)
以下是如何提取第二行的方法。
output <- lapply(rsid, function(rs){
my.form <- as.formula(paste("a_menopause ~ 0 +", rs, "+ country")))
r <- lm(my.form, data=x)
summary(r)$coefficients[2, c("Estimate", "Std. Error")]
})
do.call(rbind, output)
请注意,由于您未能提供样本数据,因此未经测试