从R中的lm脚本获取正确的输出

时间:2015-09-18 12:22:34

标签: r lm

我正在尝试计算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)
}

我哪里错了?如何更改输出以获得第二行数据?

提前致谢!

1 个答案:

答案 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)

请注意,由于您未能提供样本数据,因此未经测试