2013-06-10 4 views
-1

я три матрицы данных 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] из регрессии), при использовании как в линейной модели, когда существуют определенные наблюдения для X. В его нынешнем виде, я получаю сообщение об ошибке 0 (non-NA) cases in the lm call.

+2

Я обеспокоен тем, что вы, кажется, использует 'lm.fit' через формулы интерфейс, а также, что вы, кажется, не знают о' na.action' аргумент 'lm'. Вы можете немного объяснить? – joran

+0

na.action = na.omit решает проблему, пока некоторые элементы в столбце не являются na. Если весь столбец состоит из na, то появляется сообщение об ошибке, указанное выше. В принципе, мне нужно lm, чтобы игнорировать одну из предикторных переменных целиком в этом случае. – user1815498

+2

Хорошо, но это не объясняет, почему вы пытаетесь использовать 'lm.fit' через формулу, когда она не поддерживает формулы. Или почему вы вообще используете 'lm.fit'. – joran

ответ

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 
+0

Спасибо. Я надеялся, что в функции lm будет некоторый аргумент, который автоматически пропускает отсутствующие переменные, поэтому я мог бы избежать этого через if-else. – user1815498

+0

Я не уверен, почему это существовало бы. Он должен удалять переменные из-за colinearity, поэтому вы можете предварительно обработать свои данные, заменив все, что есть столбец 'NA', с столбцом '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 's' код. – Thomas

0

Это ненадежное альтернативное решение через mapply в качестве запуска (работает, если 1 из матриц является неполным). Я тоже думаю, что нет никакого вреда, если() иначе.

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 
+0

... что произойдет, если 'x' в порядке, но' y' - это все NA? –

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]) 
}) 
Смежные вопросы