新手需要在R中循环lm

时间:2013-03-31 20:09:41

标签: r loops lm

我是遗传学的博士生,我正在尝试使用线性回归对一些遗传数据进行关联分析。在下表中,我对每个“SNP”的每个“特征”进行了回归。还有一个交互术语包括“var”

我只使用了R 2周,而且我没有任何编程背景,所以请解释我想要了解的任何帮助。

这是我的数据样本:

Sample ID   var trait 1 trait 2 trait 3 SNP1    SNP2    SNP3
77856517    2   188      3       2        1      0       0
375689755   8   17      -1      -1        1     -1      -1
392513415   8   28       14      4        1      1       1
393612038   8   85       14      6        1      1       0
401623551   8   152      11     -1        1      0       0
348466144   7   -74      11      6        1      0       0
77852806    4   81       16      6        1      1       0
440614343   8   -93      8       0        0      1       0
77853193    5   3        6       5        1      1       1

这是我用于单个回归的代码:

result1 <-lm(trait1~SNP1+var+SNP1*var, na.action=na.exclude)

我想运行一个循环,每个特征都针对每个SNP进行测试。

我一直在尝试修改我在网上找到的代码,但我总是遇到一些我不明白如何解决的错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我个人认为问题不那么容易。特别适合R新手。

这是一个基于动态创建回归公式的解决方案。 我们的想法是使用paste函数创建不同的公式术语y~ x + var + x * var,然后使用as.formula将结果字符串tp强制转换为公式。这里yx是公式动态术语:y在c(trait1,trai2,..)和x在c(SNP1,SNP2,...)中。当然,我在这里使用lapply循环。

lapply(1:3,function(i){
 y <- paste0('trait',i)
 x <- paste0('SNP',i)
 factor1 <- x
 factor2 <- 'var'
 factor3 <- paste(x,'var',sep='*')
 listfactor <- c(factor1,factor2,factor3)
 form <- as.formula(paste(y, "~",paste(listfactor,collapse="+")))
 lm(formula = form, data = dat)
})

我希望有人能够提供更简单的解决方案,更多的是R-ish one:)

修改

感谢@DWin评论,我们可以将公式简化为y~x*var,因为这意味着yxvarx*var <建模/ p>

因此上面的代码将简化为:

 lapply(1:3,function(i){
     y <- paste0('trait',i)
     x <- paste0('SNP',i)
     LHS <- paste(x,'var',sep='*')
     form <- as.formula(paste(y, "~",LHS)
     lm(formula = form, data = dat)
    })