Как мне работать с NA в остатках в регрессии в R? - PullRequest
9 голосов
/ 30 июля 2011

Итак, у меня есть некоторые проблемы с некоторыми значениями NA в остатках регрессии сечения lm в R.

Проблема не в самих NA значениях, а в том, как их представляет R.

Например:

test$residuals
#          1          2          4          5 
#  0.2757677 -0.5772193 -5.3061303  4.5102816 
test$residuals[3]
#        4 
# -5.30613 

В этом простом примере значение NA приведет к пропаданию одного из остатков. Когда я извлекаю остатки, я ясно вижу, что третий индекс отсутствует. Пока все хорошо, нареканий нет. Проблема в том, что соответствующий числовой вектор теперь на один пункт короче, поэтому третий индекс фактически является четвертым. Как я могу заставить R возвращать эти остатки вместо этого, то есть явно показывать NA вместо пропуска индекса?

test$residuals
#          1          2          3          4          5 
#  0.2757677 -0.5772193         NA -5.3061303  4.5102816

Мне нужно отслеживать все индивидуальные остатки, чтобы моя жизнь стала намного проще, если бы я мог извлечь их таким образом.

Ответы [ 3 ]

16 голосов
/ 30 июля 2011

Я только что нашел этот погуглил немного глубже.Функция resid на lm с na.action=na.exclude - это путь.

3 голосов
/ 31 июля 2011

Еще одна идея состоит в том, чтобы использовать преимущества имен строк, связанных с фреймом данных, предоставленным в качестве входных данных для lm.В этом случае остатки должны сохранять имена из исходных данных.Доступ к остаткам из вашего примера даст значение -5.3061303 для test$residuals["4"] и NA для test$residuals["3"].

Однако это не совсем отвечает на ваш вопрос.Один из подходов к выполнению именно того, о чем вы просили, с точки зрения возврата значений NA в остатки, показан ниже:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA)
> Z<-lm(y~x,data=D)
> D[names(Z$residuals),"residual"]<-Z$residuals
> D
   x   y residual
1 NA 2.1       NA
2  2 3.2    -0.28
3  3 4.9     0.55
4  4 5.0    -0.22
5  5 6.0    -0.09
6  6 7.0     0.04

Если вы делаете прогнозы, основанные на результатах регрессии, вы можете указать na.action=na.exclude в lm.См. Результаты справки для na.omit для обсуждения.Обратите внимание, что простое указание na.exclude на самом деле не возвращает значения NA обратно в вектор ошибок.

Как отмечалось в предыдущем ответе, resid (синоним residuals) предоставляет универсальную функцию доступа, в которой остатки будут содержать желаемые значения NA, если na.exclude было указано в lm.Использование resid, вероятно, является более общим и понятным подходом.В этом случае код для приведенного выше примера будет изменен на:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA)
> Z<-lm(y~x,data=D,na.action=na.exclude)
> D$residuals<-residuals(Z)
1 голос
/ 30 июля 2011

Здесь показана иллюстрированная стратегия с использованием слегка измененного примера на странице справки lm. Это прямое применение определения остатка:

## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
# Two NA's introduced
weight <- c(4.17,5.58,NA,6.11,4.50,4.61,5.17,4.53,5.33,5.14,
 4.81,4.17,4.41,3.59,5.87,3.83,6.03,NA,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
lm.D9 <- lm(weight ~ group)
rr2 <- weight- predict(lm.D9, na.action=na.pass)
Warning message:
In weight - predict(lm.D9, na.action = na.pass) :
  longer object length is not a multiple of shorter object length
> rr2
 [1] -0.8455556  0.5644444         NA  1.0944444 -0.5155556 -0.4055556  0.1544444
 [8] -0.4855556  0.3144444  0.5044444  0.1744444 -0.4655556 -0.2255556 -1.0455556
[15]  1.2344444 -0.8055556  1.3944444         NA -0.6955556 -0.3255556

Я думаю, что было бы опасно напрямую изменять объект lm, чтобы lm.D9 $ residual возвращал этот результат.

...