proste uzupełnianie braków danych

26 views
Skip to first unread message

Paweł Kleka

unread,
Jan 21, 2015, 4:33:16 AM1/21/15
to polska-grupa-...@googlegroups.com
Mam dane wzrostu i wagi w grupach wiekowych i płciowych dzieci. Chcę policzyć im BMI, ale nie wszyscy rodzice podali oba parametry.
Czy jest "gotowiec" pozwalający zastąpić braki danych średnią wg grupy i płci?

Napisałem prostą pętle, ale nie działa, bo: missing values are not allowed in subscripted assignments of data frames.
Ręcznie jest ok - wyszukuje w obu ramkach co trzeba i podstawia też. Ale w pętli nie :-(

# dane - zbór surowych danych
# tab_norm - tabela ze średnimi wartościami BMI w płci i wieku

#Krok 1
tab_norm ⇠ tabela ze średnim wzrostem i średnią wagą w grupach wiekowych dla płci

#Krok 2 - wyszukaj w danych NA i zastąp wartościa z tabeli 
for(p in 1:2){
  tmp ⇠ tab_norm[tab_norm$płeć==p,'wiek'] # osobno dla płci, ponieważ różnią się
  for(w in 1:length(tmp)){
    dane[dane$wiek==tmp[w] & dane$płeć==p & is.na(dane$BMI), 'BMI']  ⇠ tab_norm[tab_norm$wiek==tmp[w] & tab_norm$płeć==p, 'BMI']
  }
}

Maciej Beręsewicz

unread,
Jan 21, 2015, 4:44:21 AM1/21/15
to Polska Grupa Uzytkownikow R
Zobacz funkcje z pakietu impute (z Bioconductor) lub inne z task view (Official Statistics - Imputation). Poniżej przykład z dplyr

library(dplyr)
dane <- data_frame(A = c(2,5,1,NA,6,3,4,NA),
                   Group = c(1,1,1,1,2,2,2,2))

dane <- dane %>%
        group_by(Group) %>%
        mutate(A_imp = ifelse(is.na(A),mean(A,na.rm=T),A),
               A_means = mean(A,na.rm=T))


Uwaga - imputacja średnią raczej nie jest dobrym pomysłem, ponieważ rozkład będzie bardziej wysmukły niż w rzeczywistości co może wprowadzić obciążenie.


--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „Polska Grupa Uzytkownikow R” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na polska-grupa-uzytko...@googlegroups.com.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.



--
pozdrawiam,
MB

===========================

Maciej Beręsewicz
tel: 663 06 26 87
mail: maciej.b...@gmail.com

Tomasz BURZYKOWSKI

unread,
Jan 21, 2015, 5:20:33 AM1/21/15
to polska-grupa-...@googlegroups.com

Uzupelnianie pojedyncza wartoscia (single-value imputation), niewazne jaka, to generalnie zly pomysl. Jesli juz, warto uzyc uzupelniania wielokrotnego (multiple imputation) wartosciami losowanymi z rozkladu warunkowego. Polecam strone http://www.stefvanbuuren.nl/mi/Software.html , ktora zawiera pomocna liste narzedzi dostepnych w R.

 

Alternatywa jest uzycie zastosowanie analizy opartej na funkcji wiarogodnosci, czyli modelu parametrycznego.

 

Generalnie, jesli sa braki w danych i chce sie je sensownie uwzglednic, analiza sie komplikuje i „proste” triki nie wystarczaja.

 

Powodzenia!

T.B.

Paweł Kleka

unread,
Jan 22, 2015, 6:55:55 AM1/22/15
to polska-grupa-...@googlegroups.com
Dziękuję za namiary.

Założenie uzupełniania braków było takie, że w badanej grupie dzieci są typowe, więc waga (lub wzrost) będzie przeciętny w grupie wiekowej.
Jest to uproszczenie, ale zmienne te nie są potrzebne dalej poza wyznaczeniem kategorii BMI.
Tym nie mniej z ciekawością sprawdzę inne sposoby wypełnienia braków (btw sposób z dplyr umocnił moją miłość do tego pakietu ;-)

Pozdrawiam
Paweł

Reply all
Reply to author
Forward
0 new messages