我是遗传学的博士生,我正在尝试使用线性回归对一些遗传数据进行关联分析。在下表中,我对每个“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进行测试。
我一直在尝试修改我在网上找到的代码,但我总是遇到一些我不明白如何解决的错误。
感谢您的帮助。
答案 0 :(得分:4)
我个人认为问题不那么容易。特别适合R新手。
这是一个基于动态创建回归公式的解决方案。
我们的想法是使用paste
函数创建不同的公式术语y~ x + var + x * var
,然后使用as.formula
将结果字符串tp强制转换为公式。这里y
和x
是公式动态术语: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
,因为这意味着y
由x
,var
和x*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)
})