Not a Number

Not a Number

Niepopularny NaN. Jego pojawienie się w macierzy sygnalizuje kłopoty, które pojawiły się w momencie zbierania danych oraz kłopoty, które nadejdą, gdy dane zaczniemy przetwarzać. NaN nie powinien gościć w macierzach zbyt długo, jeśli jest to trzeba go usunąć.

Skąd się biorą NaN'y?

Z oblodzenia czujnika temperatury, z niechęci pacjenta do przyznania się jaką ma masę, z błędnym zapisem danych do pliku. Powodów może być kilka, efekt jest podobny. W tabeli danych, w miejscu gdzie powinna znaleźć się liczba znajduje się dziura lub ciąg znaków  (na przykład z kodem błędu). Przy imporcie danych do MATLABa wartość takiej nietypowej komórki zostaje zastąpiona przez NaN, jedyną nie-liczbę, która może zostać zapisana w zwykłych, MATLABowych macierzach.

Takie jest pochodzenie NaNów, natomiast kiedy już się w macierzy znajdą lubią się namnażać. Cóż w końcu może zrobić MATLAB kiedy rozkażemy mu wyznaczyć jakieś statystyki dla macierzy danych, w której znajdują się NaNy? Wyrzucić kolejnego NaNa.

M = randi(10,4); % generowanie losowej macierzy
M([1, end]) = NaN; % wstawienie wartości NaN w pierwszym i ostatnim elemencie macierzy
mean(M) % wyznaczenie wartości średnich

ans =
NaN 4.2500 8.0000 NaN

Na szczęście w nowych wersjach MATLABa pojawiły się narzędzia, które pozwolą nam momentalnie uporać się z nieproszonymi elementami.

Usuń vs. Zamaluj

Przed odpaleniem konkretnej funkcji trzeba jeszcze podjąć decyzję: Czy NaNy usuwamy, czy może nadpisujemy przy pomocy któregoś z algorytmów interpolujących?

Jeżeli danych jest dużo to najlepiej jest NaNa usunąć, przy czym nie chodzi tylko o usunięcie jednej komórki danych, a całego ich wiersza (co jest konieczne jeśli chcemy zachować spójność danych). W takim wypadku z pomocą przychodzi funkcja rmmissing

M_ok = rmmissing(M);
size(M_ok)

ans =
2 4
Wynikowa macierze zmniejszyła swój rozmiar, usunięty zostały oba wiersze, w których wystąpił NaN.

Zdarza się jednak, że na radykalne posunięcie jakim jest wyrzucenie części naszych danych nie możemy sobie pozwolić. W takim wypadku możemy skorzystać z metody fillmissing, dzięki której wszystkie NaNy zostaną nadpisane wartościami liczbowymi wyznaczonymi na podstawie wskazanego algorytmu.

M_ok = fillmissing(M, 'spline'); % uzupełnienie braku z pomocą metody spline
size(M_ok)

ans =
4 4

Jeżeli nasze dane nie są przetrzymywane w jednej, wspólnej macierzy, niezbędna może być jeszcze funkcja isnan która wskaże, w których miejscach macierzy znajdują się NaNy.

in = isnan(M);
NaNkolumny =  any(in); % wskazanie kolumn, w których występują jakiekolwiek NaNy
NaNwiersze = any(in, 2); % wskazanie wiersz, w których występują jakiekolwiek NaNy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *