library(imputeTS)na.random(mydata) # Random Imputation
na.locf(mydata, option = "locf") # Last Obs. Carried Forward
na.locf(mydata, option = "nocb") # Next Obs. Carried Backward
na.interpolation(mydata) # Linear Interpolation
na.seadec(mydata, algorithm = "interpolation") # Seasonal Adjustment then Linear Interpolation
Średnia, mediana i tryb
Obliczanie ogólnej średniej, mediany lub trybu jest bardzo podstawową metodą imputacji, jest to jedyna przetestowana funkcja, która nie wykorzystuje właściwości szeregu czasowego lub związku między zmiennymi. Jest ona bardzo szybka, ale ma wyraźne wady. Jedną z wad jest to, że imputacja średnia zmniejsza wariancję w zbiorze danych.
library(imputeTS)na.mean(mydata, option = "mean") # Mean Imputation
na.mean(mydata, option = "median") # Median Imputation
na.mean(mydata, option = "mode") # Mode ImputationIn Python
from sklearn.preprocessing import Imputer
values = mydata.values
imputer = Imputer(missing_values='NaN', strategy='mean')
transformed_values = imputer.fit_transform(values)# strategy can be changed to "median" and "most_frequent"
Regresja liniowa
Na początek identyfikuje się kilka predyktorów zmiennej z brakującymi wartościami za pomocą macierzy korelacji. Najlepsze predyktory są wybierane i używane jako zmienne niezależne w równaniu regresji. Zmienna z brakującymi danymi jest używana jako zmienna zależna. Przypadki z kompletnymi danymi dla zmiennych predyktorów są wykorzystywane do generowania równania regresji; równanie jest następnie wykorzystywane do przewidywania brakujących wartości dla niekompletnych przypadków. W procesie iteracyjnym wstawiane są wartości dla brakującej zmiennej, a następnie wszystkie przypadki są wykorzystywane do przewidywania zmiennej zależnej. Kroki te powtarzane są do momentu, gdy różnica między przewidywanymi wartościami z jednego kroku na drugi jest niewielka, czyli są one zbieżne.
To „teoretycznie” zapewnia dobre oszacowania dla brakujących wartości. Istnieje jednak kilka wad tego modelu, które przeważają nad zaletami. Po pierwsze, ponieważ zastąpione wartości były przewidywane z innych zmiennych, mają one tendencję do dopasowywania się do siebie „zbyt dobrze” i dlatego błąd standardowy jest zaniżony. Trzeba również założyć, że istnieje liniowy związek między zmiennymi użytymi w równaniu regresji, gdy może go nie być.
Multiple Imputation
- Imputacja: Imputuj brakujące pozycje niekompletnych zestawów danych m razy (m=3 na rysunku). Zauważ, że imputowane wartości są losowane z rozkładu. Symulacja losowania nie uwzględnia niepewności w parametrach modelu. Lepszym podejściem jest zastosowanie symulacji Markov Chain Monte Carlo (MCMC). W wyniku tego kroku otrzymujemy m kompletnych zestawów danych.
- Analiza: Przeanalizuj każdy z m skompletowanych zbiorów danych.
- Pooling: Zintegruj m wyników analizy w końcowy wynik
# We will be using mice library in r
library(mice)
# Deterministic regression imputation via mice
imp <- mice(mydata, method = "norm.predict", m = 1)
# Store data
data_imp <- complete(imp)# Multiple Imputation
imp <- mice(mydata, m = 5)#build predictive model
fit <- with(data = imp, lm(y ~ x + z))#combine results of all 5 models
combine <- pool(fit)
Jest to zdecydowanie najbardziej preferowana metoda imputacji z następujących powodów:
– Łatwość użycia
– Brak biasów (jeśli model imputacji jest poprawny)
Imputacja zmiennych kategorycznych
- Mode imputation jest jedną z metod, ale na pewno wprowadzi bias
- Brakujące wartości mogą być traktowane jako osobna kategoria sama w sobie. Możemy stworzyć inną kategorię dla brakujących wartości i użyć ich jako innego poziomu. Jest to najprostsza metoda.
- Modele predykcyjne: Tutaj tworzymy model predykcyjny, aby oszacować wartości, które zastąpią brakujące dane. W tym przypadku, dzielimy nasz zbiór danych na dwa zestawy: Jeden zbiór bez brakujących wartości dla zmiennej (treningowy) i drugi z brakującymi wartościami (testowy). Możemy użyć metod takich jak regresja logistyczna i ANOVA do przewidywania
- Multiple Imputation
KNN (K Nearest Neighbors)
Istnieją inne techniki uczenia maszynowego, takie jak XGBoost i Random Forest do imputacji danych, ale będziemy omawiać KNN, ponieważ jest szeroko stosowany. W tej metodzie, k sąsiadów jest wybieranych na podstawie pewnej miary odległości, a ich średnia jest używana jako oszacowanie imputacji. Metoda ta wymaga wyboru liczby najbliższych sąsiadów oraz metryki odległości. KNN może przewidywać zarówno atrybuty dyskretne (najczęstsza wartość wśród k najbliższych sąsiadów), jak i atrybuty ciągłe (średnia wśród k najbliższych sąsiadów)
Metryka odległości różni się w zależności od typu danych:
1. Dane ciągłe: Powszechnie stosowane metryki odległości dla danych ciągłych to Euklidesowa, Manhattanowa i Cosinusowa
2. Dane kategoryczne: W tym przypadku powszechnie stosowana jest odległość Hamminga. Bierze ona wszystkie atrybuty kategoryczne i dla każdego z nich liczy jeden, jeśli wartość nie jest taka sama pomiędzy dwoma punktami. Odległość Hamminga jest wtedy równa liczbie atrybutów, dla których wartość była różna.
Jedną z najbardziej atrakcyjnych cech algorytmu KNN jest to, że jest on prosty do zrozumienia i łatwy do wdrożenia. Nieparametryczna natura KNN daje mu przewagę w niektórych ustawieniach, gdzie dane mogą być bardzo „nietypowe”.
Jedną z oczywistych wad algorytmu KNN jest to, że staje się on czasochłonny podczas analizowania dużych zbiorów danych, ponieważ szuka podobnych instancji w całym zbiorze. Ponadto dokładność KNN może być poważnie pogorszona w przypadku danych wielowymiarowych, ponieważ różnica między najbliższym i najdalszym sąsiadem jest niewielka.
library(DMwR)
knnOutput <- knnImputation(mydata)In python
from fancyimpute import KNN
# Use 5 nearest rows which have a feature to fill in each row's missing features
knnOutput = KNN(k=5).complete(mydata)
Wśród wszystkich metod omówionych powyżej, imputacja wielokrotna i KNN są szeroko stosowane, a imputacja wielokrotna jest prostsza i ogólnie preferowana.
Jeśli masz jakieś pytania dotyczące tego postu, proszę pytać w komentarzach, a ja dołożę wszelkich starań, aby odpowiedzieć.
.