Wykresy HE (***)

(Kierując się sugestiami z maili, trudniejsze techniczne wpisy oznaczać będę gwiazdkami w tytule)

GPS w domowych zastosowaniach pozwala kierowcom ominąć korki, ale w bardziej przemysłowych zastosowaniach pozwala na zarządzanie flotą pojazdów lub sterowanie bojowym dronem. Podobnie jest i z wizualizacją. Słupki i kropki można wykorzystać by pokazać kilka średnich ale istnieją też dla nich bardziej zaawansowane zastosowania, takie jak np. prezentacja różnic w strukturach kowariancji. I dziś będzie o takich wizualizacjach, ale po kolei.

Problem z którym ostatnio miałem do czynienia jest następujący (dziedzina: antropologia). Mamy czaszki z różnych lokalizacji i od osobników obu płci. Każda czaszka jest opisana zbiorem pięciu liczb opisujących odległości pomiędzy określonymi punktami na czaszce. Co chcemy sprawdzić? Czy i jak parametry czaszek różnią się pomiędzy płciami i lokalizacjami.

Gdybyśmy parametry czaszek opisywali jedną liczbą zamiast pięcioma na tak postawiony problem można by podejść stosując klasyczną dwukierunkową analizę wariancji.
Mając pięć parametrów opisujących czaszki, gdybyśmy każdy z nich traktowali niezależnie moglibyśmy tak postawiony problem rozwiązać pięcioma niezależnymi analizami wariancji.
Ale parametry są zależne i w tym przypadku lepszym podejściem jest zastosowanie modeli umożliwiających jednoczesne modelowanie wielowymiarowych zmiennych.

Problem jednoczesnego modelowania wielowymiarowych cech pojawia się dosyć często, szczególnie gdy zmienne, które opisujemy są zależne. Przykładowo w łącznym modelowaniu ilości mleka, białka i tłuszczu w udoju lub w analizie czynników wpływających na poziom umiejętności (opisany przez zestaw zmiennych).

Gdzie w tym zagadnieniu są ciekawe wykresy? Zobaczmy. Zaczniemy od przypomnienia jak sprawa wygląda problem testowania dla jednowymiarowych zmiennych.

Model liniowy zazwyczaj przedstawia się w postaci

Screen Shot 2015-02-15 at 22.06.50

Czytaj dalej Wykresy HE (***)

Spark + R = SparkR

spark-project-header1
Spark podbija coraz więcej serc. Nic dziwnego, skoro z wielu stron płyną komentarze o znaczącym (o rząd wielkości) przyśpieszeniu czasu potrzebnego na analizę dużych zbiorów danych.
Mamy rozbudowany mechanizm składowania (cache) obiektów w pamięci, dzięki czemu wykonując iteracyjnie operacje na tych samych danych nie ma potrzeby katowania dysku.

Jak dla mnie pewną wadą tej platformy było to, że aplikacje w Sparku należało pisać w Java, Scala lub Pythonie. To bardzo fajne języki, ale używam wielu specjalistycznych narzędzi statystycznych dostępnych w programie R i nie chciałbym ich przepisywać na python a tym bardziej na Java.

Szczęśliwie jednak, powstał łącznik dla R, powalający na integracje R i Sparka. Takie połączenie zapączkowało ponad rok temu, zainicjował je Shivaram Venkataraman z Berkeley. Z czasem kilka innych osób dołączyło do rozwoju pakietu SparkR
http://amplab-extras.github.io/SparkR-pkg/.

Dziś podzielę się pierwszymi wrażeniami z używania tego pakietu.

Czytaj dalej Spark + R = SparkR

Ładne mapy ciepła

image3

Czy wiecie, na których skoczniach Kamil Stoch zdobył najwięcej punktów w poprzednim sezonie?

Jakiś czas temu natknąłem się na pakiet pheatmaps dla programu R, który generuje ładniejsze mapy ciepła niż standardowy heatmap z R. Stąd też jego nazwa p(retty)heatmaps.

Zobaczmy te mapy na przykładzie. Zazwyczaj pakiet pheatmaps jest wykorzystywany w genomice, ale my poniżej użyjemy go do prezentacji wyników w skokach narciarskich w sezonie 2013/2014 (Zbiór danych użyty w konkursie na wizualizacje danych podczas konferencji PAZUR, zobacz zgłoszenia tutaj).
Dla każdego ze skoczków, który zdobył przynajmniej 400 punktów w klasyfikacji generalnej policzymy ile zdobył punktów na każdej ze skoczni.

Następnie tę macierz (skoczek vs. skocznia) przedstawiamy za pomocą mapy ciepła.

Mapa ciepła to wizualizacja macierzy liczb, w której wartość liczbowa danej komórki macierzy przedstawiona jest kolorem, a podobieństwo wierszy i kolumn przedstawione jest za pomocą dendrogramów.

Dane o skokach wczytamy z pakietu SmarterPoland. Są to dane użyte w konkursie na najlepszą wizualizację podczas konferencji PAZUR 2014.
Na początek trochę dplyr’owej magii aby policzyć liczbę punktów zdobytych do klasyfikacji generalnych uzyskanych na poszczególnych skoczniach przez poszczególnych skoczków.

Czytaj dalej Ładne mapy ciepła

Czy prosta regresja liniowa może pobić na głowę SVM i Random Forest?

Znajomy brał udział w projekcie, w którym na podstawie historii należało wykonać predykcję w przód cechy Y. Problem polegał na tym, że cecha Y wykazywała tendencje do wzrostu. Na potrzeby tego wpisu Y to może być mleczność krów lub zapotrzebowanie na energię czy cokolwiek innego co z czasem średnio rośnie.

Rozmawialiśmy trochę o tym co może się sprawdzić w tego typu analizach. Jako benchmark wykorzystaliśmy współczesne techniki pozwalające na podgrzanie procesora typu lasy losowe czy SVM. Okazuje się jednak (po fakcie, jest to nawet zgodne z intuicją ;-), że jeżeli występuje w miarę stabilny trend to zakres wartości obserwowanych w przyszłości może być inny niż zakres wartości obserwowanych w przeszłości. W tym przypadku techniki takie jak zwykła regresja liniowa mogą dać lepsze wyniki niż wspomniane SVM i RF.

Rozważmy taki przykład. Mamy do dyspozycji N predyktorów, chcemy przewidzieć rozwój cechy Y. W rzeczywistości ta cecha zależy tylko od pierwszego z N predyktorów. W szranki postawimy SVM, RandomForest, regresję liniową i regresję z regularyzacją typu lasso.

Przykład będzie czysto symulacyjny.

Zacznijmy od wylosowania danych, po 100 obserwacji i N=25 predyktorów. Zbiór testowy będzie poza domeną zbioru uczącego, wszystkie zmienne przesuwamy o +1.

library(dplyr)
library(lasso2)
library(e1071)
library(randomForest)
library(ggplot2)
 
# will be useful in simulations
getData <- function(n = 100, N = 25 ){
  x <- runif(N*n) %>%
    matrix(n, N)
  # artificial out-of-domain [0-1]
  x_test <- x + 1
 
  list(x = x, 
       y = x[,1] * 5 + rnorm(n), 
       x_test = x_test, 
       y_test = x_test[,1] * 5 + rnorm(n))  
}
 
# let's draw a dataset
gdata <- getData()
head(gdata$y)
# [1] -0.5331184  3.1140116  4.9557897  3.2433499  2.8986888  5.2478431
dim(gdata$x)
# [1] 100  25

Czytaj dalej Czy prosta regresja liniowa może pobić na głowę SVM i Random Forest?