在多元回归中忽略NA

时间:2013-06-10 21:31:44

标签: r

我有三个数据矩阵MatZMatXMatY,其中矩阵ZYX的每列对应对同一表达式探针的一组观察结果。对于每列i,我想对ZX进行Y回归,即

lm(MatZ[,i]~MatX[,i]+MatY[,i])

循环遍历所有i列。这个问题是MatX的某些列都是NA。因此,当lm的所有元素都是MatZ[,i]时,MatY[,i]需要MatX[,i]执行NAMatX[,i]的线性回归(即离开{{} 1}}退出回归),同时在X定义观察时在线性模型中使用两者。就目前而言,我收到错误0 (non-NA) cases in the lm call

3 个答案:

答案 0 :(得分:1)

这是一个不使用if的解决方案。这将两个预测变量列合并为一个矩阵,然后仅选择那些不是全部NA的列。

lapply(seq_len(ncol(MatZ)), function(i) {
    m <- cbind(MatX[, i], MatY[, i])
    keep <- colSums(matrix(!is.na(m), ncol=2)) > 0
    lm(MatZ[, i] ~ m[, keep])
})

答案 1 :(得分:0)

MatZ <- matrix(rnorm(1000),nrow=100)
MatX <- matrix(rnorm(1000),nrow=100)
MatY <- matrix(rnorm(1000),nrow=100)

MatX[,2] <- NA
MatY[,4] <- NA

condlm <- function(i){
    if(sum(is.na(MatX[,i]))==dim(MatZ)[1])
        lm <- lm(MatZ[,i]~MatY[,i])
    else if(sum(is.na(MatY[,i]))==dim(MatZ)[1])
        lm <- lm(MatZ[,i]~MatX[,i])
    else
        lm <- lm(MatZ[,i]~MatX[,i]+MatY[,i])
}

lms <- lapply(1:dim(MatZ)[2], condlm)
lms

答案 2 :(得分:0)

这是一个非稳健的替代解决方案,通过mapply作为开始(如果其中一个矩阵不完整,则有效)。我也认为if()else没有坏处。

MatW <- matrix(rnorm(16),nrow=4)
MatY <- matrix(rnorm(16),nrow=4)
MatZ <- matrix(rnorm(16),nrow=4)
MatW[ , 3] <- NA
is.na(MatW[ ,3]) # True
lm.help2 <- function (x, y, z){
  if (is.na(all(x))) lm(z ~ y)[1] else lm(z ~ x + y)[1]}
mapply(lm.help2, 
       split(MatW, col(MatW)), split(MatY, row(MatY)), split(MatZ, row(MatZ)))
# $`1.coefficients`
# (Intercept)           x           y 
# 0.5736469  -0.4142749  -0.6161875 
# 
# $`2.coefficients`
# (Intercept)           x           y 
# -0.3755538   0.1491310  -1.0966652 
# 
# $`3.coefficients` 
# (Intercept)           y # Only 1 variable in regression equation!
# 0.6374279  -0.8962027 
# 
# $`4.coefficients`
# (Intercept)           x           y 
# -1.1016562  -0.7240938  -0.5976613