我有三个数据矩阵MatZ
,MatX
和MatY
,其中矩阵Z
,Y
,X
的每列对应对同一表达式探针的一组观察结果。对于每列i
,我想对Z
和X
进行Y
回归,即
lm(MatZ[,i]~MatX[,i]+MatY[,i])
循环遍历所有i
列。这个问题是MatX
的某些列都是NA
。因此,当lm
的所有元素都是MatZ[,i]
时,MatY[,i]
需要MatX[,i]
执行NA
对MatX[,i]
的线性回归(即离开{{} 1}}退出回归),同时在X
定义观察时在线性模型中使用两者。就目前而言,我收到错误0 (non-NA) cases in the lm call
。
答案 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