Chciałbym regresować wektor B względem każdej kolumny w macierzy A. Jest to trywialne, jeśli nie ma brakujących danych, ale jeśli macierz A zawiera brakujące wartości, to moja regresja w stosunku do A jest ograniczona i obejmuje tylko wiersze, w których wszystkie wartości są obecne (domyślne zachowanie na.omit ). To powoduje nieprawidłowe wyniki dla kolumn bez brakujących danych. Mogę regresować macierz kolumn B względem pojedynczych kolumn macierzy A, ale mam tysiące regresji do wykonania, a to jest zbyt wolne i nieeleganckie. Na.exclude funkcja wydaje się być zaprojektowany dla tej sprawy, ale nie mogę tego dokonać. Co robię tutaj źle? Używanie R 2.13 na OSX, jeśli ma to znaczenie.
A = matrix(1:20, nrow=10, ncol=2)
B = matrix(1:10, nrow=10, ncol=1)
dim(lm(A~B)$residuals)
# [1] 10 2 (the expected 10 residual values)
# Missing value in first column; now we have 9 residuals
A[1,1] = NA
dim(lm(A~B)$residuals)
#[1] 9 2 (the expected 9 residuals, given na.omit() is the default)
# Call lm with na.exclude; still have 9 residuals
dim(lm(A~B, na.action=na.exclude)$residuals)
#[1] 9 2 (was hoping to get a 10x2 matrix with a missing value here)
A.ex = na.exclude(A)
dim(lm(A.ex~B)$residuals)
# Throws an error because dim(A.ex)==9,2
#Error in model.frame.default(formula = A.ex ~ B, drop.unused.levels = TRUE) :
# variable lengths differ (found for 'B')
r
missing-data
linear-model
David Quigley
źródło
źródło
Odpowiedzi:
Edycja: źle zrozumiałem twoje pytanie. Istnieją dwa aspekty:
a)
na.omit
ina.exclude
oba dokonują przypadkowego usunięcia w odniesieniu zarówno do predyktorów, jak i kryteriów. Różnią się tylko tym, że funkcje ekstraktora, takie jakresiduals()
lubfitted()
wypełniają swoje wyjście za pomocąNA
s dla pominiętych przypadkówna.exclude
, dzięki czemu mają wyjście o tej samej długości co zmienne wejściowe.b) Prawdziwy problem nie tkwi w tej różnicy między,
na.omit
ina.exclude
wydaje się, że nie chcesz usuwania przypadków z uwzględnieniem zmiennych kryteriów, co robią oba.lm()
, wykonując czynności w następujący sposób:lm()
źródło
Mogę wymyślić dwa sposoby. Jednym z nich jest połączenie danych,
na.exclude
a następnie ponowne rozdzielenie danych:Innym sposobem jest użycie
data
argumentu i utworzenie formuły.Jeśli wykonujesz dużo regresji, pierwszy sposób powinien być szybszy, ponieważ wykonuje się mniej magii w tle. Chociaż jeśli potrzebujesz tylko współczynników i reszt, sugeruję użycie
lsfit
, co jest znacznie szybsze niżlm
. Drugi sposób jest nieco ładniejszy, ale na moim laptopie próba podsumowania wynikowej regresji powoduje błąd. Spróbuję sprawdzić, czy to błąd.źródło
Poniższy przykład pokazuje, jak tworzyć prognozy i reszty zgodne z oryginalną ramką danych (przy użyciu opcji „na.action = na.exclude” w lm () w celu określenia, że NA należy umieścić w wektorach reszt i predykcji, w których oryginalna ramka danych brakowało wartości. Pokazuje także, jak określić, czy przewidywania powinny obejmować tylko obserwacje, w których zarówno zmienne objaśniające, jak i zależne były kompletne (tj. przewidywania ściśle w próbie) lub obserwacje, w których zmienne objaśniające były kompletne, a zatem możliwe jest przewidywanie Xb ( tj. łącznie z prognozowaniem poza próbą dla obserwacji, które miały pełne zmienne objaśniające, ale brakowało zmiennej zależnej).
Korzystam z cbind, aby dodać przewidywane i resztkowe zmienne do oryginalnego zestawu danych.
źródło