diff --git a/warsztat 2016.11.07/praca_domowa_2016.11.07.Rmd b/warsztat 2016.11.07/praca_domowa_2016.11.07.Rmd new file mode 100644 index 0000000..4db06d5 --- /dev/null +++ b/warsztat 2016.11.07/praca_domowa_2016.11.07.Rmd @@ -0,0 +1,198 @@ +--- +title: "Praca domowa na 7 listopada 2016" +author: "Tomasz Żółtak" +date: "24 października 2016" +output: html_document +--- + +# Przygotowanie do pracy + + 1. Otwórz w RStudio plik "praca_domowa_2016.11.07.Rmd" (np. menu: File -> Open file...). + * Mogło się zdarzyć, że przy zapisywaniu pliku "praca_domowa_2016.11.07.Rmd" z programu pocztowego na dysk Twojego komputera do jego nazwy zostało dopisane dodatkowo rozszerzenie ".txt". W takim przypadku po otwarciu go w RStudio kod nie będzie się kolorował (RStudio uzna go za zwykły plik tesktsowy, a nie plik raportu R). Aby rozwiązać problem, mając taki plik otwarty w RStudio wybierz z menu: File -> Save As... i w okienku, w którym ma być podana nazwa pliku wpisz "praca_domowa_2016.11.07.Rmd", po czym kliknij "zapisz". Możesz potem skasować wersję pliku z dodanym rozszerzeniem ".txt". + 3. Otwórz w RStudio plik "dane_2016.11.07.RData" (np. menu: File -> Open file...). + * Pojawi się okno zawierające pytanie, czy chcesz wczytać obiekty z pliku danych do przestrzeni roboczej - klikamy "tak". + 4. Otwórz w przeglądarce internetowej plik "warsztat_2016.11.07.html", żeby móc korzystać z niego jako pomocy. + +# Wczytywanie danych + +Jeśli plik "dane_2016.11.07.RData" zapisałeś/aś w tym samym folderze, co plik "praca_domowa_2016.11.07.Rmd" (który właśnie edytujesz), to poniższa linijka kodu pozwoli wczytać dane na potrzeby "zknitowania" raportu (gdybyś chciał(a) to zrobić). + +```{r comment="", prompt=TRUE, collapse=TRUE} +load("dane_2016.11.07.RData") +``` + +Powyższego polecenia możesz też użyć, żeby wczytać dane zamiast otwierania pliku metodą przez menu: File -> Open file... Jednakże aby operacja ta się udała, aktywny folder R musi być ustawiony na ten, w którym znajduje się ten plik. Aby sprawdzić, jaki jest folder roboczy, wywołaj w konsoli funkcję `getwd()`. Możesz go zmienić, używając funkcji `setwd("ścieżka_do_folderu")`. + +# Braki danych i specjalne wartości liczbowe (do przeczytania) + +## Braki danych w operacjach logicznych + +Dokonując operacji logicznych alternatywy (*lub*) oraz koniunkcji (*i*), z użyciem wektorów zawierających braki danych trzeba mieć na uwadze, że R wartość `NA` stanowi trzecią, zupełnie legalną, wartość logiczną, która w operacjach tych zachowuje się następująco: + +```{r comment="", prompt=TRUE, collapse=TRUE} +c(TRUE, FALSE) & NA +c(TRUE, FALSE) | NA +# to samo w tabelce +m = matrix(c(c(TRUE, FALSE) & NA, c(TRUE, FALSE) | NA), ncol = 2) +colnames(m) = c(" & NA", " | NA") +rownames(m) = c("TRUE", "FALSE") +m +``` + +## Braki danych w operacjach porównania + +Jeśli jedną (lub oboma) z dwóch wartości porównywanych w ramach zastosowania operatorów `==`, `!=`, `>`, `<`, `>=`, `<=` jest brak danych (`NA`), to w efekcie zwrócony zostanie brak danych. + +```{r comment="", prompt=TRUE, collapse=TRUE} +c(-1, 1, NA) > 0 +``` + +## Braki danych a wybieranie elementów wektora (macierzy) + +Jeśli wybieramy elementy wektora (macierzy, innego rypu obiektu) wykorzystując porównanie (czy ogólnie rzecz biorąc wektor wartości logicznych), musimy mieć na uwadze, że zwrócone zostaną **nie** te elementy, dla których wektor użyty do indeksowania (wyboru) przyjmuje wartości `TRUE` (choć zapewne tego właśnie byśmy oczekiwali) ale te, dla których nie przyjmuje on wartości `FALSE`. Tak więc zwrócone zostaną wszystkie elementy, dla których wekotr indeksujący przyjmuje wartości `TRUE` lub `NA`. + +```{r comment="", prompt=TRUE, collapse=TRUE} +x = c(1:10, NA) +x +x > 5 +x[x > 5] # zwraca również element z brakie danych! +``` + +Ponieważ typowo (a przynajmniej tak wynika z mojego osobistego doświadczenia) nie prowadzi to do wyniku, który chcielibyśmy osiągnąć, musimy pamiętać o zastosowaniu w takim przypadku środków zaradczych: użycia funkcji `is.na()` lub `na.omit()`, albo operatora `%in%`. + + 1. Użycie funkcji `is.na()` w ramach składni postaci `x[warunek_odnoszący_się_do_x & !is.na(x)]`: +```{r comment="", prompt=TRUE, collapse=TRUE} +x +is.na(x) +x[x > 5 & !is.na(x)] # teraz dostajemy to, czego typowo oczekujemy +``` + + 2. Użycie funkcji `na.omit()` w celu usunięcia z wektora elementów z brakami danych. +```{r comment="", prompt=TRUE, collapse=TRUE} +x +y = na.omit(x) +y +y[y > 5] +``` + + 3. Użycie operatora `%in%`. Operator `%in%` dla każdej wartości wektora podanego przed operatorem zwraca `TRUE`, jeśli występuje ona wśród elementów wektora podanego po operatorze lub `FALSE` w przeciwnym wypadku. Widać jednak, że aby móc postąpić w ten sposób, musimy być w stanie podać wyczerpujący zbiór wartości, które mogą przyjąć te elementy wektora, które chcemy wybrać. +```{r comment="", prompt=TRUE, collapse=TRUE} +x +x %in% 6:10 # po operatorze musimy podać zbiór konkretnych wartości +x[x %in% 6:10] +``` + +## Specjalne wartości liczbowe + +Pewne operacje są w matematyce zasadzie niedozwolone, lub nie mają sensu, np. dzielenie przez zero, czy wykonywanie jakichkolwiek operacji arytmetycznych na nieskończonościach. Próba ich wykonania w R nie wywoła jednak błędu, za to spowoduje zwrócenie w wyniku jednej ze specjalnych wartości liczbowych. + +### Nieskończoność + +W R element wektora liczb może mieć wartość *nieskończoność*: `Inf` lub *minus nieskończoność*: `-Inf` i **nie są** one traktowane jak braki danych! Wartości te możemy wykorzystać do porównań większe/mniejsze: + +```{r comment="", prompt=TRUE, collapse=TRUE} +Inf > 0 +c(1, 0, -Inf) >= 0 +Inf > 10^308 +# ale +Inf > 10^309 +# bo +10^308 # to się jeszcze daje reprezentować w typie danych 'numeric' +10^309 # a to jest już zbyt duża liczba +Inf == Inf +# Inf to nie brak danych! +is.na(Inf) +``` + +Poddają się też one operacjom arytmetycznym (z pewnym ograniczeniem w zakresie odejmowania i dzielenia), choć w większości wypadków zwracają w nich siebie lub minus siebie: + +```{r comment="", prompt=TRUE, collapse=TRUE} +Inf + 2 +Inf + Inf +Inf * 5 +Inf * -5 +Inf * Inf +Inf / 123 +# ale (p. dalsza część warsztatu) +Inf - Inf +Inf / Inf +``` + +Wartości `Inf` lub `-Inf` typowo uzyskujemy w wyniku wykonania jednej z dwóch operacji: + + 1. Podania jako argumentu funkcji `min()` lub `max()` wektora zawierającego same braki danych, przy pozostawieniu wartości argumentu `na.rm` na `TRUE` (poskutkuje to wywołaniem ostrzeżenia). +```{r comment="", prompt=TRUE, collapse=TRUE} +min(NA, na.rm = TRUE) +max(NA, na.rm = TRUE) +``` + + + 2. Podzieleniu liczby (nie będącej zerem) przez zero (zwróćmy uwagę, że oznacza to przyjęcie milczącego założenia, że tak na prawdę to nie chcieliśmy podzielić przez zero, tylko coś bardzo, bardzo małego - na tyle, że zostało zapisane jako zero, bo w programie zabrakło nam precyzji pozwalającej reprezentować tak małe liczby). +```{r comment="", prompt=TRUE, collapse=TRUE} +10 / 0 +-5 / 0 +-5 / (10 / 10^309) +``` + +### "Nie liczba" + +Wartość "Nie liczba": `NaN` jest specyficznym rodzajem braku danych, który uzyskamy, jeśli spróbujemy wykonać jedną z trzech operacji: + + 1. Podzielić zero przez zero. + 2. Odjąć *nieskończoność* od *nieskończoności*. + 3. Podzielić *nieskończoność* przez *nieskończoność*. + +```{r comment="", prompt=TRUE, collapse=TRUE} +0 / 0 +Inf - Inf +Inf / Inf + +is.na(NaN) +``` + +Wartość `NaN` jest uznawana za brak danych. Tyle tylko, że niesie ze sobą dodatkową inforację, że powstał on w wyniku próby wykonania *nielegalnej* operacji arytmetycznej. + +# Analiza danych (do wykonania) + +## Zadanie 1. + +W badaniu PISA badane są umiejętności uczniów w zakresie trzech dziedzin: *matematyki* (zmienna `scorePISAMath`), *czytania ze zrozumieniem* (zmienna `scorePISARead`) i *rozumowania w naukach przyrodniczych* (zmienna `scorePISAScie`). Możemy przyjąć, że wszystkie te trzy zmienne wyrażone są na jednej skali (jest to skala standardowa o średniej 500 i odchyleniu standardowym 100 w populacji krajów należących do OECD). Wykonaj niezbędne analizy i określ, które z dziedzin okazały się średnio najtrudniejsze, a które średnio najłatwiejsze oddzielnie dla zbadanych kobiet i mężczyzn. + + - Kobiety najniższe średnie wyniki uzyskały w dziedzinie **NAZWA DZIEDZINY** (**WPISZ WARTOŚĆ ŚREDNIEJ**), a najwyższe średnie wyniki uzyskały w dziedzinie **NAZWA DZIEDZINY** (**WPISZ WARTOŚĆ ŚREDNIEJ**). +```{r comment="", prompt=TRUE, collapse=TRUE} +# to jest miejsce na Twój kod + + + +``` + + - Mężczyźni najniższe średnie wyniki uzyskali w dziedzinie **NAZWA DZIEDZINY** (**WPISZ WARTOŚĆ ŚREDNIEJ**), a najwyższe średnie wyniki uzyskali w dziedzinie **NAZWA DZIEDZINY** (**WPISZ WARTOŚĆ ŚREDNIEJ**). +```{r comment="", prompt=TRUE, collapse=TRUE} +# to jest miejsce na Twój kod + + + +``` + +## Zadanie 2. + +Przeanalizuj, jak różnią się między sobą średnie wyniki z poszczególnych dziedzin testu PISA pomiędzy tymi badanymi, dla których liczba lat nauki rodzica (zmienna `parEdu`; ściśle jest to maksimum z liczby lat nauki matki i liczby lat nauki ojca) była nie większa niż mediana liczby lat nauki rodzica a tymi badanymi, dla których liczba lat nauki rodzica była większa od mediany. **Pomiń w analizie osoby, dla których liczba lat nauki rodzica jest nieznana.** Zapisz odpowiedzi: + +Różnica średnich wyników pomiędzy badanymi posiadającymi lepiej a badanymi posiadającymi gorzej wykształconych rodziców (zgodnie z przedstawioną wyżej definicją tych dwóch grup) to: + + - **WPISZ LICZBĘ** w dziedzinie *matematyki*, + - **WPISZ LICZBĘ** w dziedzinie *czytania ze zrozumieniem*, + - **WPISZ LICZBĘ** w dziedzinie *rozumowania w naukach przyrodniczych*. + +```{r comment="", prompt=TRUE, collapse=TRUE} +# to jest miejsce na Twój kod + + + +``` + +# Czynności końcowe + + - Zapisz wyniki swojej pracy (tj. plik "praca_domowa_2016.11.07.Rmd"). + - Zmień jego nazwę na "moje_imie_i_nazwisko_2016.11.07.Rmd". + - Wyślij go na adres email: **zoltakt@is.uw.edu.pl** diff --git a/warsztat 2016.11.07/praca_domowa_2016.11.07.html b/warsztat 2016.11.07/praca_domowa_2016.11.07.html new file mode 100644 index 0000000..2652676 --- /dev/null +++ b/warsztat 2016.11.07/praca_domowa_2016.11.07.html @@ -0,0 +1,370 @@ + + + + +
+ + + + + + + + + +Jeśli plik “dane_2016.11.07.RData” zapisałeś/aś w tym samym folderze, co plik “praca_domowa_2016.11.07.Rmd” (który właśnie edytujesz), to poniższa linijka kodu pozwoli wczytać dane na potrzeby “zknitowania” raportu (gdybyś chciał(a) to zrobić).
+> load("dane_2016.11.07.RData")
+Powyższego polecenia możesz też użyć, żeby wczytać dane zamiast otwierania pliku metodą przez menu: File -> Open file… Jednakże aby operacja ta się udała, aktywny folder R musi być ustawiony na ten, w którym znajduje się ten plik. Aby sprawdzić, jaki jest folder roboczy, wywołaj w konsoli funkcję getwd()
. Możesz go zmienić, używając funkcji setwd("ścieżka_do_folderu")
.
Dokonując operacji logicznych alternatywy (lub) oraz koniunkcji (i), z użyciem wektorów zawierających braki danych trzeba mieć na uwadze, że R wartość NA
stanowi trzecią, zupełnie legalną, wartość logiczną, która w operacjach tych zachowuje się następująco:
> c(TRUE, FALSE) & NA
+[1] NA FALSE
+> c(TRUE, FALSE) | NA
+[1] TRUE NA
+> # to samo w tabelce
+> m = matrix(c(c(TRUE, FALSE) & NA, c(TRUE, FALSE) | NA), ncol = 2)
+> colnames(m) = c(" & NA", " | NA")
+> rownames(m) = c("TRUE", "FALSE")
+> m
+ & NA | NA
+TRUE NA TRUE
+FALSE FALSE NA
+Jeśli jedną (lub oboma) z dwóch wartości porównywanych w ramach zastosowania operatorów ==
, !=
, >
, <
, >=
, <=
jest brak danych (NA
), to w efekcie zwrócony zostanie brak danych.
> c(-1, 1, NA) > 0
+[1] FALSE TRUE NA
+Jeśli wybieramy elementy wektora (macierzy, innego rypu obiektu) wykorzystując porównanie (czy ogólnie rzecz biorąc wektor wartości logicznych), musimy mieć na uwadze, że zwrócone zostaną nie te elementy, dla których wektor użyty do indeksowania (wyboru) przyjmuje wartości TRUE
(choć zapewne tego właśnie byśmy oczekiwali) ale te, dla których nie przyjmuje on wartości FALSE
. Tak więc zwrócone zostaną wszystkie elementy, dla których wekotr indeksujący przyjmuje wartości TRUE
lub NA
.
> x = c(1:10, NA)
+> x
+ [1] 1 2 3 4 5 6 7 8 9 10 NA
+> x > 5
+ [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE NA
+> x[x > 5] # zwraca również element z brakie danych!
+[1] 6 7 8 9 10 NA
+Ponieważ typowo (a przynajmniej tak wynika z mojego osobistego doświadczenia) nie prowadzi to do wyniku, który chcielibyśmy osiągnąć, musimy pamiętać o zastosowaniu w takim przypadku środków zaradczych: użycia funkcji is.na()
lub na.omit()
, albo operatora %in%
.
is.na()
w ramach składni postaci x[warunek_odnoszący_się_do_x & !is.na(x)]
:> x
+ [1] 1 2 3 4 5 6 7 8 9 10 NA
+> is.na(x)
+ [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
+> x[x > 5 & !is.na(x)] # teraz dostajemy to, czego typowo oczekujemy
+[1] 6 7 8 9 10
+na.omit()
w celu usunięcia z wektora elementów z brakami danych.> x
+ [1] 1 2 3 4 5 6 7 8 9 10 NA
+> y = na.omit(x)
+> y
+ [1] 1 2 3 4 5 6 7 8 9 10
+attr(,"na.action")
+[1] 11
+attr(,"class")
+[1] "omit"
+> y[y > 5]
+[1] 6 7 8 9 10
+%in%
. Operator %in%
dla każdej wartości wektora podanego przed operatorem zwraca TRUE
, jeśli występuje ona wśród elementów wektora podanego po operatorze lub FALSE
w przeciwnym wypadku. Widać jednak, że aby móc postąpić w ten sposób, musimy być w stanie podać wyczerpujący zbiór wartości, które mogą przyjąć te elementy wektora, które chcemy wybrać.> x
+ [1] 1 2 3 4 5 6 7 8 9 10 NA
+> x %in% 6:10 # po operatorze musimy podać zbiór konkretnych wartości
+ [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE
+> x[x %in% 6:10]
+[1] 6 7 8 9 10
+Pewne operacje są w matematyce zasadzie niedozwolone, lub nie mają sensu, np. dzielenie przez zero, czy wykonywanie jakichkolwiek operacji arytmetycznych na nieskończonościach. Próba ich wykonania w R nie wywoła jednak błędu, za to spowoduje zwrócenie w wyniku jednej ze specjalnych wartości liczbowych.
+W R element wektora liczb może mieć wartość nieskończoność: Inf
lub minus nieskończoność: -Inf
i nie są one traktowane jak braki danych! Wartości te możemy wykorzystać do porównań większe/mniejsze:
> Inf > 0
+[1] TRUE
+> c(1, 0, -Inf) >= 0
+[1] TRUE TRUE FALSE
+> Inf > 10^308
+[1] TRUE
+> # ale
+> Inf > 10^309
+[1] FALSE
+> # bo
+> 10^308 # to się jeszcze daje reprezentować w typie danych 'numeric'
+[1] 1e+308
+> 10^309 # a to jest już zbyt duża liczba
+[1] Inf
+> Inf == Inf
+[1] TRUE
+> # Inf to nie brak danych!
+> is.na(Inf)
+[1] FALSE
+Poddają się też one operacjom arytmetycznym (z pewnym ograniczeniem w zakresie odejmowania i dzielenia), choć w większości wypadków zwracają w nich siebie lub minus siebie:
+> Inf + 2
+[1] Inf
+> Inf + Inf
+[1] Inf
+> Inf * 5
+[1] Inf
+> Inf * -5
+[1] -Inf
+> Inf * Inf
+[1] Inf
+> Inf / 123
+[1] Inf
+> # ale (p. dalsza część warsztatu)
+> Inf - Inf
+[1] NaN
+> Inf / Inf
+[1] NaN
+Wartości Inf
lub -Inf
typowo uzyskujemy w wyniku wykonania jednej z dwóch operacji:
min()
lub max()
wektora zawierającego same braki danych, przy pozostawieniu wartości argumentu na.rm
na TRUE
(poskutkuje to wywołaniem ostrzeżenia).> min(NA, na.rm = TRUE)
+Warning in min(NA, na.rm = TRUE): brak argumentów w min; zwracanie wartości
+Inf
+[1] Inf
+> max(NA, na.rm = TRUE)
+Warning in max(NA, na.rm = TRUE): brak argumentów w max; zwracanie wartości
+-Inf
+[1] -Inf
+> 10 / 0
+[1] Inf
+> -5 / 0
+[1] -Inf
+> -5 / (10 / 10^309)
+[1] -Inf
+Wartość “Nie liczba”: NaN
jest specyficznym rodzajem braku danych, który uzyskamy, jeśli spróbujemy wykonać jedną z trzech operacji:
> 0 / 0
+[1] NaN
+> Inf - Inf
+[1] NaN
+> Inf / Inf
+[1] NaN
+>
+> is.na(NaN)
+[1] TRUE
+Wartość NaN
jest uznawana za brak danych. Tyle tylko, że niesie ze sobą dodatkową inforację, że powstał on w wyniku próby wykonania nielegalnej operacji arytmetycznej.
W badaniu PISA badane są umiejętności uczniów w zakresie trzech dziedzin: matematyki (zmienna scorePISAMath
), czytania ze zrozumieniem (zmienna scorePISARead
) i rozumowania w naukach przyrodniczych (zmienna scorePISAScie
). Możemy przyjąć, że wszystkie te trzy zmienne wyrażone są na jednej skali (jest to skala standardowa o średniej 500 i odchyleniu standardowym 100 w populacji krajów należących do OECD). Wykonaj niezbędne analizy i określ, które z dziedzin okazały się średnio najtrudniejsze, a które średnio najłatwiejsze oddzielnie dla zbadanych kobiet i mężczyzn.
> # to jest miejsce na Twój kod
+>
+>
+>
+> # to jest miejsce na Twój kod
+>
+>
+>
+Przeanalizuj, jak różnią się między sobą średnie wyniki z poszczególnych dziedzin testu PISA pomiędzy tymi badanymi, dla których liczba lat nauki rodzica (zmienna parEdu
; ściśle jest to maksimum z liczby lat nauki matki i liczby lat nauki ojca) była nie większa niż mediana liczby lat nauki rodzica a tymi badanymi, dla których liczba lat nauki rodzica była większa od mediany. Pomiń w analizie osoby, dla których liczba lat nauki rodzica jest nieznana. Zapisz odpowiedzi:
Różnica średnich wyników pomiędzy badanymi posiadającymi lepiej a badanymi posiadającymi gorzej wykształconych rodziców (zgodnie z przedstawioną wyżej definicją tych dwóch grup) to:
+> # to jest miejsce na Twój kod
+>
+>
+>
+Na dzisiejszych zajęciach poznamy funkcje pozwalające obliczyć typowo wykorzystywane parametry poziomu wartości i parametry rozproszenia zmiennych statystycznych. Zobaczymy też, w jaki sposób R traktuje (typowo) braki danych.
+Na dzisiejszych zajęciach poznamy funkcje pozwalające obliczyć typowo wykorzystywane parametry poziomu wartości zmiennych statystycznych.
Zacznijmy od wczytania danych, na których będziemy dalej pracować. Funkcja load()
pozwala wczytać obiekty R zapisane w natywnym formacie R-a, czyli .RData (linijka wcześniej służy upewnieniu się, że bęziemy próbowali wczytać dane z odpowiedniego folderu). Funkcja load()
zwraca nazwy wczytanych obiektów - w tym przypadku jest to 15 wektorów. Wektor o nazwie variablesDescription opisuje znaczenie pozostałych wektorów, które zawierają dane - zmienne z dodatkowej próby badawczej uczniów szkół pogimnazjalnych, zrealizowanej w ramach badania PISA 2009.
W R nie mamy funkcji pozwalającej bezpośrednio obliczyć rozstęp, niemniej zrobienie tego samemu jest oczywiście banalnie proste. Z kolei funkcja IQR()
, służąca obliczeniu odchylenia ćwiartkowego robi to nieco inaczej, niż w typowych (stosowanych w Polsce) definicjach (nie dzieli różnicy wartości 3. i 1. kwartyla przez dwa). Niemniej obliczenie samemu odchylenia ćwiartkowego również nie nastręcza trudności (jeśli umiemy obliczyć kwartyle).
Oblicz rozstęp i odchylenie ćwiartkowe zmiennej scoreTMR
.
> # rozstęp
-> # to jest miejsce na TWój kod
->
-> # odchylenie ćwiartkowe
-> # to jest miejsce na TWój kod
->
-Do obliczenia wariancji i odchylenia standardowego domyślnie wykorzystue się w R funkcje odpowiednio var()
i sd()
. W praktyce jest jednak z nimi pewien problem, bowiem zwracają one wartości, które są nieobciążonymi przewidywaniami (odpowiednio wariancji i odchylenia standardowego), jeśli zadany im wektor traktować jako prostą próbę losową z populacji, dla której chcemy oszacować wartość danego parametru.
Od strony technicznej oznacza to, że w przypadku wariancji suma kwadratów różnic od średniej jest dzielona nie przez liczbę elmentów wektora, lecz przez liczbę elementów pomniejszoną o jeden. Jeśli wektor jest długi, robi to niewielką różnicę, jednak jeśli jest krótki, będzie ona bardzo wyraźna.
-> # to się nie uda, bo var() nie liczy wariancji jako statystyki opisowej
-> # lecz jako oszacoanie wartości parametru w populacji na podstawie prostej próby losowej
-> var(1)
-[1] NA
-Jeśli chcemy uzyskać normalną wariancję/odchylenie standardowe musimy więc obliczyć ją sobie sami, lub skorygować wynik działania funkcji var()
lub sd()
:
> varTMR = mean((scoreTMR - mean(scoreTMR, na.rm = TRUE))^2, na.rm = TRUE)
-> sdTMR = varTMR^0.5
-> varTMR
-[1] 54.03407
-> sdTMR
-[1] 7.350787
-> # dla porównania
-> var(scoreTMR, na.rm = TRUE)
-[1] 54.04975
-> sd(scoreTMR, na.rm = TRUE)
-[1] 7.351854
-> var2TMR = mean(scoreTMR^2, na.rm = TRUE) - mean(scoreTMR, na.rm = TRUE)^2
-> sd2TMR = var2TMR^0.5
-> var2TMR
-[1] 54.03407
-> sd2TMR
-[1] 7.350787
-var()
lub sd()
:> poprawka = (length(scoreTMR) - 1) / length(scoreTMR)
-> poprawka
-[1] 0.9997366
-> var(scoreTMR^2, na.rm = TRUE) * poprawka
-[1] 423791.9
-> sd(scoreTMR, na.rm = TRUE) * poprawka^0.5
-[1] 7.350885
-Współczynniki zmienności są często bardziej użyteczną miarą zróżnicowania w przypadku zmiennych mierzonych na skalach ilorazowych, które przyjmują tylko wartości nieujemne, a więc mają zakres wartości ograniczony z jednej strony, ale otwarty z drugiej. Pozwalają bowiem uwzględnić, że w takim przypadku w ramach grupy o wysokiej średniej wartości zmiennej jest znacznie więcej miejsca na różnicowanie się wartości, niż w ramach grupy, w której średnia wartości tej zmiennej jest niska, a więc bliska granicy zakresu możliwych do przyjęcia wartości.
-Najszerzej wykorzystywany typ wskaźnika zmieności obliczamy dzieląc wartość odchylenia standardowego przez wartość średniej.
-Jaka zmienna/zmienne spośród wczytanych na początku zajęć spełnia warunki umożliwiające policzenie współczynnika zmienności? Odpowiedz na podstawie opisu zmiennych i wartości parametrów wartości (kod poniżej).
-> variablesDescription
- schoolType
- "School type (track)"
- sex
- "Sex of student"
- age
- "How old student was in 2009"
- scoreTMR
- "Score on Raven's Progressive Matrices test [0-60]"
- scoreKKS
- "Score on Cultural Competences Scale [60-240]"
- scoreKNS
- "Score on Snyder's Adult Hope Scale [8-64]"
- scorePISAMath
-"Score on PISA mathematics test (pseudoEAP estimator)"
- scorePISARead
- "Score on PISA reading test (pseudoEAP estimator)"
- scorePISAScie
- "Score on PISA science test (pseudoEAP estimator)"
- noPersHous
- "Number of persons in a household"
- wealth
- "Highest parental occupational status"
- income
- "Highest parental education in years"
- parEdu
- "Wealth"
- hisei
- "Houshold monthly income"
-> summary(cbind(age, scoreTMR, scoreKKS, scoreKNS, scorePISAMath, scorePISARead,
-+ scorePISAScie, noPersHous, wealth, income, parEdu, hisei))
- age scoreTMR scoreKKS scoreKNS
- Min. :15.79 Min. :11.00 Min. : 60.0 Min. : 8.00
- 1st Qu.:17.17 1st Qu.:45.00 1st Qu.:162.0 1st Qu.:43.00
- Median :17.45 Median :50.00 Median :178.0 Median :48.00
- Mean :17.47 Mean :48.54 Mean :178.3 Mean :47.74
- 3rd Qu.:17.72 3rd Qu.:54.00 3rd Qu.:195.0 3rd Qu.:53.00
- Max. :20.21 Max. :60.00 Max. :240.0 Max. :64.00
- NA's :322 NA's :350 NA's :325 NA's :337
- scorePISAMath scorePISARead scorePISAScie noPersHous
- Min. :199.2 Min. :231.7 Min. :226.8 Min. : 2.000
- 1st Qu.:457.2 1st Qu.:467.3 1st Qu.:473.9 1st Qu.: 4.000
- Median :528.2 Median :534.8 Median :538.6 Median : 4.000
- Mean :523.5 Mean :524.5 Mean :531.0 Mean : 4.536
- 3rd Qu.:588.2 3rd Qu.:589.0 3rd Qu.:596.2 3rd Qu.: 5.000
- Max. :793.7 Max. :749.1 Max. :756.3 Max. :14.000
- NA's :86
- wealth income parEdu hisei
- Min. :-2.8256 Min. : 1.136 Min. : 3.00 Min. :16.00
- 1st Qu.:-0.7216 1st Qu.: 5.305 1st Qu.:11.00 1st Qu.:33.00
- Median :-0.2500 Median : 7.494 Median :11.00 Median :43.00
- Mean :-0.1678 Mean : 9.598 Mean :12.34 Mean :45.86
- 3rd Qu.: 0.2512 3rd Qu.:10.818 3rd Qu.:12.00 3rd Qu.:55.00
- Max. : 2.7703 Max. :68.456 Max. :16.00 Max. :90.00
- NA's :9 NA's :9 NA's :43 NA's :111
-Oblicz wartość współczynnika zmienności dla tej zmiennej (zmienych).
-> # to jest miejsce na TWój kod
-Oblicz odchylenie przeciętne od mediany zmiennej scoreTMR
, pamiętając że:
abs()
.> # to jest miejsce na Twój kod
-Dokonując operacji logicznych alternatywy (lub) oraz koniunkcji (i), z użyciem wektorów zawierających braki danych trzeba mieć na uwadze, że R wartość NA
stanowi trzecią, zupełnie legalną, wartość logiczną, która w operacjach tych zachowuje się następująco:
> c(TRUE, FALSE) & NA
-[1] NA FALSE
-> c(TRUE, FALSE) | NA
-[1] TRUE NA
-> # to samo w tabelce
-> m = matrix(c(c(TRUE, FALSE) & NA, c(TRUE, FALSE) | NA), ncol = 2)
-> colnames(m) = c(" & NA", " | NA")
-> rownames(m) = c("TRUE", "FALSE")
-> m
- & NA | NA
-TRUE NA TRUE
-FALSE FALSE NA
-Jeśli wybieramy elementy wektora (macierzy, innego rypu obiektu) wykorzystując porównanie (czy ogólnie rzecz biorąc wektor wartości logicznych), musimy mieć na uwadze, że zwrócone zostaną nie elementy, dla których wektor użyty do indeksowania (wyboru) przyjmuje wartości TRUE
ale te, dla których nieprzyjmuje on wartości FALSE
.
> x = c(1:10, NA)
-> x
- [1] 1 2 3 4 5 6 7 8 9 10 NA
-> x > 5
- [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE NA
-> x[x > 5] # zwraca również element z brakie danych!
-[1] 6 7 8 9 10 NA
-Ponieważ typowo (a przynajmniej tak wynika z mojego osobistego doświadczenia) nie prowadzi to do wyniku, który chcielibyśmy osiągnąć, musimy pamiętać o zastosowaniu w takim przypadku środków zaradczych: użycia funkcji is.na()
lub na.omit()
, albo operatora %in%
.
> # funkcja is.na(): użycie składni '[warunek & !is.na(...)]
-> x
- [1] 1 2 3 4 5 6 7 8 9 10 NA
-> is.na(x)
- [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
-> x[x > 5 & !is.na(x)] # teraz dostajemy to, czego typowo oczekujemy
-[1] 6 7 8 9 10
-> # funkcja na.omit(): usuwa braki danych z obiektu
-> x
- [1] 1 2 3 4 5 6 7 8 9 10 NA
-> y = na.omit(x)
-> y
- [1] 1 2 3 4 5 6 7 8 9 10
-attr(,"na.action")
-[1] 11
-attr(,"class")
-[1] "omit"
-> y[y > 5]
-[1] 6 7 8 9 10
-> # operator %in%: dla każdej wartości wektora podanego przed operatorem zwraca
-> # TRUE, jeśli występuje ona wśród elementów wektora podanego po operatorze
-> # lub FALSE w przeciwnym wypadku
-> x
- [1] 1 2 3 4 5 6 7 8 9 10 NA
-> x %in% 6:10 # tyle że musieliśmy tu podać zbiór konkretnych wartości
- [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE
-> x[x %in% 6:10]
-[1] 6 7 8 9 10
-Pewne operacje są w matematyce zasadzie niedozwolone, lub nie mają sensu, np. dzielenie przez zero, czy wykonywanie jakichkolwiek operacji arytmetycznych na nieskończonościach. Próba ich wykonania w R nie wywoła jednak błędu, za to spowoduje zwrócenie w wyniku jednej ze specjalnych wartości liczbowych.
-W R element wektora liczb może mieć wartość nieskończoność: Inf
lub minus nieskończoność: -Inf
i nie są one traktowane jak braki danych! Wartości te możemy wykorzystać do porównań większe/mniejsze:
> Inf > 0
-[1] TRUE
-> c(1, 0, -Inf) >= 0
-[1] TRUE TRUE FALSE
-> Inf > 10^308
-[1] TRUE
-> # ale
-> Inf > 10^309
-[1] FALSE
-> # bo
-> 10^308 # to się jeszcze daje reprezentować w typie danych 'numeric'
-[1] 1e+308
-> 10^309 # a to jest już zbyt duża liczba
-[1] Inf
-> # Inf to nie brak danych!
-> is.na(Inf)
-[1] FALSE
-Poddają się też one operacjom arytemtycznym (z wyjątkiem odejmowania), choć w większości wypadków zwracają w nich siebie lub minus siebie:
-> Inf + 2
-[1] Inf
-> Inf + Inf
-[1] Inf
-> Inf * 5
-[1] Inf
-> Inf * -5
-[1] -Inf
-> Inf * Inf
-[1] Inf
-> Inf / 123
-[1] Inf
-> # ale (p. dalsza część warsztatu)
-> Inf - Inf
-[1] NaN
-> Inf / Inf
-[1] NaN
-Wartości Inf
lub -Inf
typowo uzyskujemy w wyniku wykonania jednej z dwóch operacji:
min()
lub max()
wektora zawierającego same braki danych, przy pozostawieniu wartości argumentu na.rm
na TRUE
(poskutkuje to wywołaniem ostrzeżenia).> min(NA, na.rm = TRUE)
-Warning in min(NA, na.rm = TRUE): brak argumentów w min; zwracanie wartości
-Inf
-[1] Inf
-> max(NA, na.rm = TRUE)
-Warning in max(NA, na.rm = TRUE): brak argumentów w max; zwracanie wartości
--Inf
-[1] -Inf
-> 10 / 0
-[1] Inf
-> -5 / 0
-[1] -Inf
-> -5 / (10 / 10^309)
-[1] -Inf
-Wartość “Nie liczba”: NaN
jest specyficznym rodzajem braku danych, który uzyskamy, jeśli spróbujemy wykonać jedną z trzech operacji:
> 0 / 0
-[1] NaN
-> Inf - Inf
-[1] NaN
-> Inf / Inf
-[1] NaN
->
-> is.na(NaN)
-[1] TRUE
-Wartość NaN
jest uznawana za brak danych. Tyle tylko, że niesie ze sobą dodatkową inforację, że powstał on w wyniku próby wykonania nielegalnej operacji arytmetycznej.
Zostanie nadesłana mailem.
+G. Lissowski, J. Haman i M. Jasiński. (2011). Podstawy statystyki dla socjologów. Wyd. II poprawione. Warszawa: Wydawnictwo Naukowe SCHOLAR. - Rozdziały: 1.1.-1.2., rozdziały 1.2.2, 3.5.-3.6., 4.1.-4.2. oraz 4.5. w zakresie, w jakim odnosi się do parametrów omówionych w 4.1. i 4.2.
+Względnie inne publikacje, w których opisane są
+i następujące parametry poziomu wartości zmiennych statystycznych:
+oraz następujące parametry rozproszenia zmiennych statystycznych:
+