1

我试图将这个 QA:“R 中的有效循环逻辑回归”应用于我自己的问题,但我不能让它完全发挥作用。我没有尝试使用 apply,但有几个人告诉我,这里最好使用 for 循环(如果有人不相信,请随时解释!)论坛。

这就是我想要实现的目标:我有一个数据集,其中包含 3 个预测变量(性别、年龄、种族)和一个因变量(比例),用于几个人的 86 个遗传位置。我想为每个位置运行双变量线性回归(因此 3 个预测变量有 86 个线性回归)。然后我想以某种易于阅读的格式输出结果;我的想法是一个矩阵,其中行=性别、年龄和种族,列=86 个位置。每个行*列组合都会有一个 ap 值。然后我可以调用 p 值<0.1(或我想要的任何阈值)来轻松查看哪些预测变量与每个位置的比例显着相关。

这是我到目前为止的代码。

BB <- seq.csv[,6:91]   #the data frame containing the 86 positions
AA <- seq.csv[,2:4]    #the data frame containing the 3 predictor variables

linreg <- matrix(NA,3,86)  #make a results vector and fill it with NA
    for (i in 1:86)     #loop over each position variable
    {
              for (j in 1:3)  #for each position variable, loop over each predictor
    {
              linreg[i,j] <- lm(BB[,i]~AA[,j])  #bivariate linear regression
}}

无论我如何更改它(例如,将其简化为仅循环一个预测变量的位置),我仍然会收到一个错误,即我的矩阵长度不同(要替换的项目数不是替换长度的倍数) . 实际上,length(linreg)=286 (3*86) and length(BB)=86 and length(AA)=3。我知道后两个是数据帧,而不是矩阵......但是如果我将它们转换为矩阵,我会得到一个无效的类型错误(变量'BB [,i]'的无效类型(列表))。我不知道如何解决这个错误,因为我对 R 的理解不够好......我已经查阅了Applied Statistical Genetics with RArt of R Programming的书籍,但无济于事,我一直在谷歌搜索所有天。而且我什至还没有编写输出结果的编码......

我将不胜感激任何调试技巧或一些关于更好编码方式的建议!谢谢大家。

4

1 回答 1

2

在事先不知道数据结构的情况下很难给出明确的答案,但这可能会奏效。我假设您的两个数据框具有相同的行数(观察值):

df <- cbind( AA[ , 2:4 ] , BB[ , 6:91 ] )
mods <- apply( as.data.frame( df[ , 4:89 ] ) , 2 , FUN = function(x){ lm( x ~ df[,1] + df[,2] + df[,3] } )

# The rows of this matrix will correspond to the intercept, gender, age, race, and the columns are the results for each of your 86 genetic postions
pvals <- sapply( mods , function(x){ summary(x)$coefficients[,4] )

至于这是否正确,我相信您作为遗传流行病学家的判断!

于 2013-03-08T23:30:10.300 回答