146 Wybrane procedury statystyczne
Rzadko się zdarza, że dane można bezpośrednio wykorzystywać do analiz statystyce nych. W większości przypadków zebrane dane wymagają wstępnego przetwarzania Co więcej, etap przygotowywania danych zajmuje często więcej czasu niż same ana- ; lizy. Poniżej przedstawimy dwie grupy metod, często wykonywanych na wczesnyjr&f etapie przeprowadzania analiz. Pierwsza grupa to metody radzenia sobie z brakują, cymi obserwacjami, druga to metody do wstępnej transformacji zmiennych.
•ćgSpEgj
W środowisku R brakujące obserwacje są oznaczane symbolem NA. Do sprawdzania, czy dane (wektory, macierze, ramki danych) zawierają brakujące obserwacje możni -wykorzystać funkcję is.naO. Jej wynikiem jest podobna struktura (a wiec również ■; wektor, macierz lub ramkę danych) wypełniona wartościami logicznymi TRUE (gdy w tej pozycji jest brakująca obserwacja) lub FALSE (w przeciwnym razie).
Tnn&nk.... wektor bez wartości brakujących, a może jeszcze wektor z obserwacjami obecnymi?
Jeżeli w ramce danych są brakujące obserwacje, to najprostszym sposobem radzenia sobie z nimi jest usunięcie całego wiersza. Usunąć brakujące dane z wektora można funkcją na. omit (stats). Jej wynikiem jest wektor wartości pozbawiony wartości brakujących. Do usunięcia wierszy zawierających brakujące obserwacje z ramki danych służy funkcja complete.casesO. Poniżej przedstawiamy przykłady wykorzystania obu funkcji.
> # wczytujemy zbiór danych z brakującymi obserwacjami
> library(dprep)
> data(hepatitis)
> # jak duży to zbiór danych? 1SS przypadków
> dim(hepatitis)
[1] 155 20
> # ile jest brakujących obserwacji (pomiarów) w tym zbiorze danych
> sum(ls.naChepatitls)) fi] 167
> tt ile jest brakujących przypadków (z przynajmniej jednym brakującym
pomiarem) u tym zbiorze danych
> sum(apply(ie.na(hepatitis),l,max))
[1] 76
> indeksyKompletnych ■■ complete.cases(hepatitis)
> # rozmiar danych po usunięciu brakujących przypadków, zostało 52X
przypadków
> dim(hepatitis[indeksyKompletnych,])
[1] 80 20
# zajmijmy się tylko 19 kolumną summary(hepatitis[, 19])
NA’s
67.00
Min. Ist Qu. Median Hean 3rd Qu. Marc.
0.00 46.00 61.00 61.85 76.25 100.00
# usuwamy brakujące elementy tego wektora summary(na.omit(hepatitis[,19]))
Min. Ist Qu. Median Mean 3rd Qu. Max.
0.00 46.00 61.00 61.85 76.25 100.00
Przetwarzanie wstępne
147
V; Usunięcie wierszy z brakującymi obserwacjami to najłatwiejsze rozwiązanie, ale jSŚajigcydowaiiie nie najlepsze. Pomijając frustrację badacza, któremu mówimy, że usu-iięliśmy kilkadziesiąt procent zbieranych w trudzie wyników, ponieważ brakowało w nich jednego pomiaru, to taka redukcja danych prowadzi do niepotrzebnego po-gorszenia właściwości procedur statystycznych, zwiększenia wariancji estymatorów, zmniejszenia mocy testów itp. Zamiast usuwać całe wiersze, zalecanym postępowaniem jesf w miejsce brakujących pomiarów wstawianie (imputowanie) sztucznych pomiarów. Ogólnie rzecz biorąc imputacje wstawia się na jeden z dwóch sposobów:
• W miejsce brakującego pomiaru wstawia się wartość charakterystyczną dla danej zmiennej. Najczęściej wstawia się średnią, medianę lub (rzadziej) modę
' dla danej zmiennej. Bardziej wyrafinowane rozwiązanie to dopasowanie modelu regresji na zbiorze kompletnych danych i w miejsce brakujących danych wstawianie wartości wyznaczonych z modelu regresji. Innym rozwiązaniem jest wyznaczanie imputacji bazując na zbiorze przypadków najbardziej podobnych do przypadku z brakującą obserwacją (tzw. knn imputation) lub wykorzystanie algorytmu EM do oceny najlepszej wartości do wstawienia.
• Wygenerowanie wielu replikacji zbioru danych z imputacjami. W każdej replikacji brakujące obserwacje zastępowane są przez obserwacje wygenerowane z rozkładu określonego dla danej zmiennej. Najczęściej warunkowego, a więc: określonego przez model regresji zbudowany dla kompletnych przypadków, lub brzegowego, bazując tylko na rozkładzie brzegowym tej zmiennej. W tym przypadku kolejne kroki analizy statystycznej są wykonywane dla każdej z replikacji zbioru danych, a następnie wyniki poszczególnych kroków są ze sobą zestawiane.
Poniżej dokładniej przedstawimy pierwszy sposób generowania imputacji. Osoby zainteresowane drugim powinny zaznajomić się z funkcją areglmpute(Haisc) lub transcan(Hmisc). Warto też prześledzić ostatni przykład z tego podrozdziału.
Zacznijmy od generowania imputacji w wektorze wartości. Do tego celu wygodnie jest posłużyć się funkcją impute(Hmisc). W zależności od wartości argumentu fun, za brakujące obserwacje wstawiane są różne wartości. Domyślnie, imputowana jest mediana, ale możemy wskazać też dowolną inną funkcję. Przykładowo fun=mean im-• putować będzie wartość średnią. .Jeżeli za argument fun podstawimy wartość liczbową, to będzie ona wstawiana w miejsce brakujących obserwacji. Jeżeli f un="randora". ' to brakujące wartości będą zastąpione przez pozostałe wartości z próby, wylosowane metodą losowania ze zwracaniem. W sytuacji, gdy pierwszy argument, jest typu factor argument fun jest ignorowany, a za brakujące obserwacje imputowana jest 4 najczęściej występująca wartość.
> # wektor z brakującymi obserwacjami
> wektor - c(l,5,NA,2,8.8.3,NA.10.4)
> tt imputujemy wartość 2.5
> imputeCwektor,2.5)
5.0 2.6* 2.0 8.0 8.0 3.0 2.5* 10.0 4.0
> # imputujemy wartość średnią
> impute(wektor,mean)
1.000 5.000 5.125* 2.000 8.000 8.000 3.000 5.125* 10.000 4.000