Takie tytuły rozpoczynają zazwyczaj spory o wyższość jednego święta nad drugim. Ale nie na tym blogu. Dzisiejszy wpis ma za zadanie zilustrować pewne subtelne różnice pomiędzy tymi trzema pakietami statystycznymi. Różnice o często niebagatelnych konsekwencjach.
Wyobraźmy sobie, że podmiot X zleca nam budowę narzędzia analitycznego. Dochodzi do odbioru. Podmiot X sprawdza czy narzędzie liczy wszystko poprawnie, a tu nagle zonk. Okazuje się, że te nawet podstawowe statystyki nie zgadzają się z wartościami referencyjnymi.
O co chodzi?
Niestety w statystyce bywa tak, że ten sam parametr można szacować na różne sposoby. Każdy, kto przeżył kurs statystyki pamięta (;-)), że odchylenie standardowe można szacować na przynajmniej dwa różne sposoby (estymator obciążony i nieobciążony, czyli z dzieleniem przez n i n-1). Rzadziej się mówi o tym, że skośność i kurtoza można wyznaczać na trzy konkurencyjne popularne sposoby. A kwantyle? Okazuje się, że te można wyznaczać na 9(!) różnych sposobów.
I co gorsze, dla różnych pakietów różne sposoby są tymi ,,domyślnymi”!
Przez co, wyniki uzyskane procedurami o podobnych nazwach na tych samych danych mogą się różnić pomiędzy pakietami.
Zazwyczaj różnią się mało. Na tyle, że 99% osób może spokojnie machnąć na to ręką.
Reszta wpisu jest dla tego pozostałego 1% aptekarzy.
Skośność / kurtoza
W programie R do szacowania skośności i kurtozy można wykorzystać np. funkcje skewness i kurtosis, które są dostępne w pakiecie e1071. Obie te funkcje mają dodatkowy argument type, określający, który z trzech popularnych estymatorów skośności/kurtozy ma być wyznaczony.
W R domyślnie wykorzystywana jest trzecia z wymienionych tam definicji, a w SAS i SPSS druga.
x <- runif(101) sapply(1:3, skewness, x=x, na.rm=T) # [1] 0.1245367 0.1264220 0.1226917 sapply(1:3, kurtosis, x=x, na.rm=T) # [1] -1.116490 -1.111956 -1.153602 |
Kwantyle
W programie R do szacowania kwantyli służy funkcja quantile. Ma ona argument type, który pozwala na wskazanie jednej z 9 różnych metod wyznaczania kwantyli. W R domyślnie wykorzystywana jest definicja 7, w SAS definicja 3, a w SPSS definicja 6.
sapply(1:9, function(q) quantile(x, 0.01, type=q)) 1% 1% 1% 1% 1% 1% 1% 1% 1% 0.02272536 0.02272536 0.01426692 0.01435151 0.01858073 0.01443609 0.02272536 0.01719918 0.01754457 |
Kontrasty
W programie R modele liniowe estymuje się z użyciem funkcji lm. Argument contrasts pozwala na wskazanie kontrastów. Domyślne w R to contr.treatment, a w SAS contr.SAS.
lm(Sepal.Width~Species, data=iris, contrasts = contr.SAS)$coef # (Intercept) Speciesversicolor Speciesvirginica # 3.428 -0.658 -0.454 lm(Sepal.Width~Species, data=iris, contrasts = list(Species=contr.SAS))$coef #(Intercept) Species1 Species2 # 2.974 0.454 -0.204 |
Take home
Nawet (wydawałoby się) najbardziej podstawowe statystyki, takie jak skośność czy kwantyle mogą być różnie liczone w różnych pakietach statystycznych.
Warto o tym wiedzieć, jeżeli budujemy rozwiązanie analityczne oparte o R/SAS/SPSS, a nasz produkt będzie oceniany pod kątem poprawności z przygotowanymi szablonowymi odpowiedziami / zgodności z pewnymi regulacjami.
Różnic pomiędzy R a SAS/SPSS jest więcej. Będzie o nich można przeczytać np. w kolejnym wydaniu Przewodnika po pakiecie R 😉
jest SAS a nie ma STATA?
Nie ma też Statistica, ale to już mój obciążony punkt widzenia, bardzo rzadko korzystam z tych pakietów.
W każdym razie zgodnie z http://www.amstat.org/publications/jse/v19n2/doane.pdf Stata liczy skośność jeszcze inaczej, tak jak type=1.
Kiedy następne wydanie Przewodnika?
Prawdopodobnie na przełomie tego i przyszłego roku.