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