--- title: "Wprowadzenie do środowiska R, statystyka opisowa" author: "Bartosz Kozak" date: "28 marca 2019" output: pdf_document: default html_document: df_print: paged --- # Wprowadzenie do środowiska R Więcej informacji na temat R można znaleźć pod tymi linkami: - [Wikipedia](https://pl.wikipedia.org/wiki/R_(j%C4%99zyk_programowania)) - [Przewodnik po pakiecie R](http://pbiecek.github.io/Przewodnik/index.html) Program R działa na zasadzie "pytanie-odpowiedź". Wprowadzamy dane lub polecenie do konsoli, a program wykonuje operacje i wyświetla wynik oraz czeka na kolejne instrukcje. Znakiem zachęty (prompt) do wprowadzania kolejnych instrukcji jest symbol `>`. Wszystkie prezentowane przykłady powinny działać jeżeli zostaną wpisane DOKŁADNIE tak jak w instrukcjach. Niektóre polecenia R stają się dostępne dopiero po uruchomieniu odpowiednich bibliotek. Należy zawsze upewnić się, że wymagane biblioteki są zainstalowane i załadowane. Do ładowania bibliotek służy polecenie `library`. Zobaczmy jak działa R w praktyce. ```{r} plot(rnorm(1000)) ``` ### "Przerośnięty" kalkulator Jednym z najprostszych zastosowań programu R jest wykorzystanie go do obliczeń arytmetycznych. Jeżeli wprowadzimy działanie komputer wyświetli nam wynik działania np. ```{r} 2+3 11-5 2*4 33/11 ``` R pozwala także na wykonanie bardziej skomplikowanych obliczeń np. $e^{-2}$ ```{r} exp(-2) ``` Symbol `[1]` wyświetlany przed wynikiem jest 'Rową' konwencją wyświetlania liczb oraz wektorów. Tutaj nie wydaje się on szczególnie przydatny. Jest on jednak bardzo użyteczny przy większej liczbie wyników. Liczba w nawiasie kwadratowym jest indeksem liczby w danej linijce. Zobaczmy jak to działa na przykładzie. Wygenerujmy 15 losowych liczb z rozkładu normalnego $\mu=0, \sigma=1$. ```{r} set.seed(123) rnorm(15) ``` ### Przypisywanie zmiennych Nawet korzystając z prostego kalkulatora często spotykamy się z potrzebą zapisania cząstkowych lub pośrednich wyników obliczeń, tak aby nie trzeba było ich ponownie obliczać. R podobnie jak inne języki porgramowania pozwala na zapisywanie informacji w pamięci podręcznej komputera jako tak zwane "*zmienne symboliczne*". Oznacza to, że możemy wartościom (np. liczbowym) przypisać nazwy, a następnie ponownie użyć tych wartości przy pomocy stworzonej nazwy. Aby przypisać wartość wartość do zmiennej w języku R używa się symbolu `<-`. Przykładowo jeżeli chcemy stworzyć zmienną `x` i przypisać jej wartość 2 wykonujemy: ```{r} x <- 2 ``` Utworzoną zmienną możemy następnie przywołać: ```{r} x ``` Lub użyć w dalszych obliczeniach: ```{r} 2*x + 3 ``` Nazwy zmiennych mogą być w R tworzone dość swobodnie. Możemy stosować litery, liczby oraz symbol kropki (.) oraz podkreślenia (_). Istnieją jednak pewne ograniczenia, nazwa nie może rozpoczynać się od liczby, lub od kropki, a po niej liczby. Typowa nazwa zmiennej w R może wyglądać tak: `wysokość.1rok`. Nazwy zmiennych w R są wrażliwe na wielkość liter, czyli `WT` i `wt` dla R oznaczać będą dwie różne zmienne. Niektóre zmienne są zarezerwowane dla samego R. Zaleca się niestosowanie tych nazw do nazywania zmiennych. Zmienne jednoliterowe wykorzystywane przez R to: `c,q,t,C,D,F,I` oraz `T`. Inne nazwy wykorzystywane przez R to: `diff, df,` oraz `pt`. Większość z nich to nazwy funkcji. Użycie tych nazw do nazwania własnych zmiennych nie zawsze będzie prowadziło do problemów, jednak zaleca się nie używanie tych nazw. Przykładowo `F` oraz `T` są skrótami słów kluczowych `True` oraz `False`. Użycie `F` i/lub `T` spowoduje, że te skróty nie będą działać poprawnie. ### Arytmetyka wektorowa Nie możemy wykonać zbyt wielu analiz statystycznych na pojedynczej liczbie! Analizy statystyczne wykonywać będziemy na danych pochodzących z grupy pomiarów (np. grupa pacjentów). Jedną z zalet R jest to, że może przechowywać cały wektor danych (np. pomiarów) jako pojedynczy obiekt. Wektor jest prostym szeregiem (ciągiem) liczb. Wektor w R tworzymy następująco: ```{r} zaw.Hg <- c(20,21,22,23,27) zaw.Hg ``` Nie jest to jedyna droga wprowadzania danych do R, nie jest to też preferowana metoda, jednak krótkie wektory są wykorzystywane powszechnie w R do różnych zastosowań. W późniejszej części przedstawione zostaną inne metody wczytywania danych do programu R. Na wektorach możliwe jest wykonywanie operacji arytmetycznych, tak jak na "zwykłych" liczbach. Jeżeli wykonujemy operacje na dwóch wektorach muszą mieć one tą samą długość. Zobaczmy to na przykładzie. Załóżmy że mamy wektor z wysokością i masą ciała 6 osób. Możemy utworzyć nowy wektor z wartością współczynnika BMI, który zdefiniowany jest jako stosunek wagi (kg) do kwadratu wzrostu (m). Przykładowo: ```{r} wzrost <- c(1.75, 1.80, 1.65, 1.90, 1.74, 1.91) waga <- c(60, 72, 57, 90, 95, 72) BMI <- waga/wzrost^2 BMI ``` Zauważmy, że obliczenia wykonywane są na liczbach o tym samym indeksie w obydwu wektorach, to jest BMI `19.59184` został obliczony jako $60/1.75^2$. W istocie R pozwala na operacje arytmetyczne wektorów o różnej długości. W powyższym przykładzie wykonaliśmy potęgowania wektora wzrost (długość 6) przez wektor `2` (długość 1). Jeżeli wektory są różnej długości do elementy wektora krótszego są iterowane (powtarzane) na elementach wektora dłuższego. Zazwyczaj operacje na wektorach różnej długości wykonuje się przy modyfikacji wektora przez skalar (liczbę) przykładowo: ```{r} waga.g <- waga * 1000 waga.g ``` Arytmetyka wektorowa jest bardzo użyteczna w przypadku obliczeń statystycznych. Przypuśćmy, że chcemy obliczyć wartość średnią oraz odchylenie standardowe dla wartości w wektorze `waga`. W pierwszej kolejności obliczymy wartość średnią, $\overline{x} = \frac{\sum x_i}{n}$ ```{r} sum(waga) sum(waga)/length(waga) ``` Następnie zapiszmy średnią wartość wektora waga jako zmienna `xbar` i przejdźmy do obliczenia odchylenia standardowego, $SD=\sqrt{(\sum(x_i-\overline{x})^2)/(n-1)}$. Zrobimy to w kilku krokach, żeby zobaczyć obliczenia cząstkowe. ```{r} # zapisujemy średnią pod nazwą xbar xbar <- sum(waga)/length(waga) # obliczamy różnice między każdą wartością, a wartością średnią waga - xbar # obliczamy kwadrat tych różnic (waga - xbar)^2 # obliczamy sumę kwadratów (SS) sum((waga - xbar)^2) # obliczamy odchylenie standardowe sqrt(sum((waga - xbar)^2)/(length(waga)-1)) ``` Oczywiście R jako pakiet statystyczny ma już wbudowane funkcje służące do obliczania wartości średniej i odchylenia standardowego: ```{r} mean(waga) sd(waga) ``` ### Grafika w R Jednym z najważniejszych aspektów prezentacji i analizy danych jest tworzenie odpowiednich grafik. R podobnie jak S (język z którego R się wywodzi) ma model do tworzenia wykresów, który pozwala na łatwe tworzenie prostych wykresów, a jednocześnie pozwala na dużą kontrolę nad generowaną grafiką. Jeżeli chcemy zbadać zależność między wagą i wzrostem, pierwszym krokiem powinno być stworzenie wykresu dla tych zmiennych: ```{r} plot(wzrost,waga) ``` Wygenerowany wykres może być modyfikowany na wiele sposobów, poprzez dodanie odpowiednich argumentów do funkcji `plot`. Zmodyfikujmy nasz wykres dodając tytuł, oraz zmieniając kształt symboli punktów, a także ich kolor oraz zakres na osi x i y: ```{r} plot(wzrost,waga, main="Wykres 1", pch = 2, col = '#63e218', xlim = c(1.55,2), ylim = c(40,100)) ``` Idea za obliczaniem indeksu BMI jest taka, aby można było określić czy dana osoba jest otyła, na postawie jednej wartości (niezależnie od wzrostu). Ponieważ normalny BMI powinien być w przybliżeniu równy 22.5 możemy oczekiwać, że $waga \approx 22.5 * wzrost^2$. Możemy następnie na tej podstawie dopasować krzywą do naszego wykresu, określającą oczekiwaną wagę przy danym wzroście (zakładając prawidłowy BMI). Możemy to zrobić następująco: ```{r} plot(wzrost,waga, main="Wykres 1", pch = 2, col = '#63e218', xlim = c(1.55,2), ylim = c(40,100)) hh <- c(1.65, 1.70, 1.75, 1.80, 1.85, 1.90) lines(hh, 22.5 * hh^2) ``` Funkcja `line` wrysowuje linie o zadanych koordynatach (x,y) do ostatniego wykresu. W powyższym przykładzie stworzyliśmy nowy wektor `hh` zawierający wartości wzrostu (x), które posłużyły do stworzenia prostej dodanej do wykresu. Użycie tego wektora zamiast surowych danych w wektorze wzrost podyktowane jest dwoma przesłankami: - wartości w wektorze wzrost nie są równo rozmieszczone - wartości w wektorze wzrost nie są posortowane Zastosowanie wektora wzrost do stworzenia krzywej dodanej do wykresu nie pozwoliłoby na wygenerowanie prawidłowej krzywej. ### Wczytywanie danych do R Najłatwiejszą drogą wczytywania danych do R jest poprzez wczytanie danych z pliku tekstowego poprzez funkcję `read.table` lub jej modyfikacje `read.csv` oraz `read.csv2`. Plik tekstowy z danymi musi być zapisany jako "plain text", a nie "rich text" (czyli nie zapisywać danych w formacie .doc, .docx, lub .odt). Program R w założeniu tworzony był (i nadal jest) jako część systemu GNU. GNU jest projektem, który stara się imitować system UNIX, a w systemie UNIX dane zapisywane były jako "proste" pliki tekstowe (zazwyczaj rozdzielone znakiem tabulacji). Do R można wczytywać dane zapisane w arkuszach kalkulacyjnych (MS Excel), jednak wymaga to zastosowania dodatkowych bibliotek i nie jest polecaną (przynajmniej dla początkujących) metodą wczytywania danych do programu R. Funkcja `read.table`wczytuje dane jako obiekt `data.frame` - tabela i oczekuje, że dane w pliku tekstowym będą miały odpowiedni układ, wartości odpowiadające wierszom będą w poszczególnych liniach (bez pustych linii), a wartości odpowiadające kolumną będą rozdzielone odpowiednim symbolem (tabulator,spacja,przecinek,średnik, itp.). Pierwsza linijka może zawierać nagłówki kolumn (np. nazwy zmiennych). # Statystyka opisowa i grafika Analizę statystyczną rozpoczynamy od prostej charakteryzacji danych poprzez ich podsumowanie, a także graficzną prezentację. ### Charakterystyka zbioru danych - pojedyncza grupa Obliczenie podstawowych statystyk dla zbioru danych w programie R jest bardzo proste. Oto jak możemy obliczyć średnią, odchylenie standardowe, wariancję oraz medianę: ```{r} set.seed(123) # generujemy 50 losowych liczb x <- rnorm(50) # średnia mean(x) # odchylenie standardowe sd(x) # wariancja var(x) # mediana median(x) ``` Kwantyle mogą zostać obliczone za pomocą funkcji: ```{r} quantile(x) ``` Jak widać dzięki tej funkcji dostajemy wartość minimalną oraz maksymalną z naszego zbioru, a także kwantyle 0.25, 0.5 i 0.75. Możemy obliczyć różnicę między trzecim a pierwszym kwantylem. Rożnica ta nosi nazwę *interquartile range* - *rozstęp ćwiartkowy* (IQR) i bywa wykorzystywana jako alternatywa dla odchylenia standardowego. ```{r} q <- quantile(x) IQR <- q[4]-q[2] as.numeric(IQR) ``` Jest możliwe uzyskanie kwantyli dla innych (niż 0.25,0.5 i 0.75) wartości. Jeżeli chcemy uzyskać wartości dla *decyli* czyli wartości 0.1,0.2,0.3 itd. w R możemy wykorzystać funkcje `quantile` z odpowiednim parametrem: ```{r} pvec <- seq(0,1,0.1) pvec quantile(x,pvec) ``` Zwróćmy uwagę, że istnieje wiele różnych algorytmów na wyznaczenie kwantyli. R domyślnie używa algorytmu sumy poligonu, gdzie i-ty ranga obserwacji jest równa $(i-1)/(n-1)$ kwantylowi, a pośrednie kwantyle są uzyskiwane poprzez liniową interpolację. Inne definicje kwantyli są możliwe do użycia po zmianie wartości parametru `type` funkcji `quantile`. Więcej informacji na temat każdej funkcji R możemy uzyskać sprawdzając dokumentację dotyczącą danej funkcji. Dostęp do dokumentacji możliwy jest po wpisaniu symbolu `?`, a następnie nazwy interesującej nas funkcji. Można też skorzystać z okna pomocy programu RStudio. ```{r} ?quantile ``` Kolejnym często wykorzystywanym parametrem w statystyce opisowej jest współczynnik zmienności definiowany jako: $cv=\frac{sd}{\overline{x}}$. Współczynnik zmienności bywa nazywany statystyką ksztaltu rozkładu. Dla naszego przykładu możemy obliczyć współczynnik zmienności w następujący sposób: ```{r} cv <- sd(x)/mean(x) cv ``` Jeżeli nasz zbór danych zawiera puste wartości (brak wartości) - `NA`, obliczenie średniej (i innych parametrów opisujących dane) staje się bardziej skomplikowane. R z założenia nie pomija wartości pustych (`NA`). Zilustruje to następujący przykład: ```{r} x1 <- c(x,NA) x1 mean(x1) ``` Wartość `NA` należy rozumieć jako nieznaną wartość. Nie można określić wartości średniej zbioru, który zawiera nieznaną wartość. Dlatego przy próbie obliczenia średniej R zwraca wartość `NA`. Jeżeli chcemy pominąć wartości `NA` przy liczeniu średniej (lub innych parametrów) musimy użyć parametru `na.rm=T`, spowoduje to pominięcie przez R wszystkich wartości `NA` w zbiorze danych: ```{r} mean(x1, na.rm = T) ``` Niestety funkcja `length` nie rozpoznaje parametru `na.rm`. Jeżeli chcemy otrzymać liczbę elementów w naszym zbiorze danych z pominięciem wartości `NA` możemy to zrobić w następujący sposób: ```{r} # liczba elementów wektora x length(x) # liczba elementów wektora x1 length(x1) # liczba elementów wektora x1 innych niż NA sum(!is.na(x1)) ``` Powyższy kod wykorzystuje właściwość wartości `boolen` (`True` i `False`), które w operacjach matematycznych zamieniane są na 1 (`True`) i 0 (`False`). Podsumowanie dotyczące zbioru danych możemy też uzyskać korzystając z funkcji `summary`: ```{r} summary(x) ``` Możemy także uzyskać podsumowanie dla całej tabeli. W R wbudowanych jest kilka powszechnie znanych i wykorzystywanych w celach edukacyjnych zbiorów danych. Jednym z nich jest zbór 'Irish data set', więcej informacji można na temat tego zbioru można znaleźć [tu](https://en.wikipedia.org/wiki/Iris_flower_data_set). Jeżeli chcemy wczytać do pamięci ten zbór danych możemy wykorzystać funkcję `data`. ```{r} data("iris") summary(iris) ``` Zwróćmy uwagę, że podsumowanie dla danych numerycznych (kolumny 1:4) i danych kategoryzujących (kolumna 5) wygląda inaczej. Dla danych numerycznych uzyskujemy: - minimum i maksimum - 1 i 3 kwantyl - średnią oraz medianę Dla danych kategoryzujących otrzymujemy liczebności poszczególnych kategorii (grup). ### Graficzna prezentacja dystrybucji #### Histogram Możemy otrzymać dość dokładny obraz dystrybucji wartości w badanej próbie wykonując histogram, czyli liczbę obserwacji przypadających na dany przedział ("bins"): ```{r} hist(x) ``` ### Ćwiczenie 1 Dla danych zamieszczonych w tabeli data.txt wykonać analizę opisową (wyznaczyć średnią, odchylenie standardowe, rozstęp, medianę, decyle, współczynnik zmienności, histogram). *Wskazówka*: Dane w tabeli data.txt zapisane są w 5 kolumnach, ale reprezentują jeden zbiór danych. Przed przystąpieniem do analiz należy połączyć dane z wszystkich w jeden zbiór (wektor) danych.