Gagnaskrá

Setja upp beinagrind

Mun uppfæra gagnaskrána reglulega þegar gögnin berast. Þessi vefsíða var gerð með “File -> New File -> R Markdown”. Ýti svo á “Knit” takkan sem birtist uppi og eftir það á “Publish” sem birtist uppi í hægra horninu á þeim glugga.

require(tidyverse)  # Safn af pökkum til að eiga við gögn á snyrtilegan hátt. 
                    # Allir skrifaðir af meistaranum Hadley Wickham

require(knitr) # Pakki til að búa til flottar töflur og ritgerðir. 

df <- data_frame(
    nemandi = c('Ási', 'Brynjólfur', 'Elva', 'Hafsteinn', 
                 'Heiða', 'Íris', 'Katrín', 'Kristín', 
                'Ólafur', 'Sigríður', 'Svandís', 'Ævar'),
    kyn = rep(NA, 12),
    haed = rep(NA, 12),
    sponn = rep(NA, 12)
)

kable(df)   # Kable kemur með pakkanum knitr
nemandi kyn haed sponn
Ási NA NA NA
Brynjólfur NA NA NA
Elva NA NA NA
Hafsteinn NA NA NA
Heiða NA NA NA
Íris NA NA NA
Katrín NA NA NA
Kristín NA NA NA
Ólafur NA NA NA
Sigríður NA NA NA
Svandís NA NA NA
Ævar NA NA NA
            # Reyndar er öll þessi vefsíða gerð með knitr!

Setja inn kyn

Núna ætla ég að leyfa mér að alhæfa um kyn nemenda. Biðst fyrirfram afsökunar ef ég móðga einhvert.

df <- df %>%
    mutate(kyn = ifelse(nemandi %in% c('Ási', 'Brynjólfur', 'Hafsteinn', 'Ólafur', 'Ævar'),
                        'KK',
                        'KVK')) # Ef nemandi heitir eitt ofantalinna nafna þá KK annars KVK

kable(df)
nemandi kyn haed sponn
Ási KK NA NA
Brynjólfur KK NA NA
Elva KVK NA NA
Hafsteinn KK NA NA
Heiða KVK NA NA
Íris KVK NA NA
Katrín KVK NA NA
Kristín KVK NA NA
Ólafur KK NA NA
Sigríður KVK NA NA
Svandís KVK NA NA
Ævar KK NA NA

Setja inn mælingar

Bjó til fall sjálfur sem uppfærir upplýsingarnar fyrir mig.

nem_uppl <- function(df, nafn, haed, sponn) {
    # Finna uppl um nemanda með rétt nafn og uppfæra upplýsingar
    df[df$nemandi == nafn,c(3,4)] <- c(haed, sponn)
    # Skila nýju gagnasafni
    df
}

df <- df %>%
    nem_uppl('Hafsteinn', 167, 22) %>%
    nem_uppl('Brynjólfur', 194, 25) %>%
    nem_uppl('Ási', 180, 22) %>%
    nem_uppl('Íris', 159, 20) %>%
    nem_uppl('Sigríður', 160, 17) %>%
    nem_uppl('Svandís', 171, 18.5) %>%
    nem_uppl('Katrín', 165, 19) %>%
    nem_uppl('Ævar', 172, 22) %>%
    nem_uppl('Kristín', 170, 21) %>%
    nem_uppl('Heiða', 181, 22) %>%
    nem_uppl('Elva', 174, 18) %>%
    nem_uppl('Ólafur', 172, 24.5) %>%
    mutate('Coolguy?' = ifelse(nemandi %in% c('Ási', 'Hafsteinn'), 'No!', 'Yes!'))
kable(df)
nemandi kyn haed sponn Coolguy?
Ási KK 180 22.0 No!
Brynjólfur KK 194 25.0 Yes!
Elva KVK 174 18.0 Yes!
Hafsteinn KK 167 22.0 No!
Heiða KVK 181 22.0 Yes!
Íris KVK 159 20.0 Yes!
Katrín KVK 165 19.0 Yes!
Kristín KVK 170 21.0 Yes!
Ólafur KK 172 24.5 Yes!
Sigríður KVK 160 17.0 Yes!
Svandís KVK 171 18.5 Yes!
Ævar KK 172 22.0 Yes!

Gömul gögn

Bæta við gömlu gögnunum

karl <- c(1, 1, rep(0, 8)) # rep stendur fyrir repeat
haed <- c(182, 183, 160, 165, 166, 167, 168, 172, 172, 174)
sponn <- c(23.0, 22.5, 20.0, 21.0, 17.0, 18.5, 20.4, 20.5, 17.0, 18.0)

data_frame(
    nemandi = 'Lúði', # Þetta eru allt einhverjir lúðar
    kyn = ifelse(karl == 1, 'KK', 'KVK'), # Þetta er bara fallegri breyta svona. Skal setja á form sem GBA vill seinna
    haed = haed,
    sponn = sponn,
    'Coolguy?' = 'No!' # Það voru engin Coolguys í fyrra!
) %>% 
    union(df) -> df

require(kableExtra) # Taflan er orðin það stór að við þurfum aðeins meira fútt úr kableExtra pakkanum!

kable(df, format = 'html') %>%
    kable_styling() %>%
    scroll_box(height = '300px', width = '600px') # Núna er hægt að scrolla í gegnum hana
nemandi kyn haed sponn Coolguy?
Ævar KK 172 22.0 Yes!
Svandís KVK 171 18.5 Yes!
Sigríður KVK 160 17.0 Yes!
Ólafur KK 172 24.5 Yes!
Kristín KVK 170 21.0 Yes!
Katrín KVK 165 19.0 Yes!
Íris KVK 159 20.0 Yes!
Heiða KVK 181 22.0 Yes!
Hafsteinn KK 167 22.0 No!
Elva KVK 174 18.0 Yes!
Brynjólfur KK 194 25.0 Yes!
Ási KK 180 22.0 No!
Lúði KVK 174 18.0 No!
Lúði KVK 172 17.0 No!
Lúði KVK 172 20.5 No!
Lúði KVK 168 20.4 No!
Lúði KVK 167 18.5 No!
Lúði KVK 166 17.0 No!
Lúði KVK 165 21.0 No!
Lúði KVK 160 20.0 No!
Lúði KK 183 22.5 No!
Lúði KK 182 23.0 No!

Myndrit

Núna ætla ég aðeins að leika mér að búa til myndrit. GGplot pakkinn í R er einn besti hugbúnaðurinn í dag til að búa til lýsandi myndir. Og það góða er að ég þarf ekki að standa í basli að búa alltaf til myndirnar aftur. Um leið og ég uppfæri upplýsingarnar um okkur keyrir kóðinn aftur og uppfærir líka myndirnar!

Fylgnirit

Fylgnirit fyrir alla óháð kyni

require(papaja) # Þetta er pakki sem sér um allt sem tengist APA kerfinu. 
                # Það góða við R er að einhver nördi út í bæ hefur alltaf leyst vandamál manns áður
df %>%
    ggplot(aes(sponn, haed)) + # Þetta býr bara til rammann
    geom_point() + # Þetta bætir við punktum
    geom_smooth(method = 'lm', se = FALSE) + # Þetta bætir við lýsandi línu. LM er Linear Model (línuleg aðhvarfs)
    theme_apa() + # Breyta útlitinu á glugganum
    labs(x = 'Spönn', y = 'Hæð', title = 'Myndrit af Hæð eftir Spönn') # Breyta merkingum.

Fylgnirit eftir kyni

df %>%
    ggplot(aes(sponn, haed, col = kyn)) + # EINA SEM ÉG ÞURFT AÐ BREYTA VAR BÆTA VIÐ COL=KYN! VÓ!
    geom_point() + # Þetta bætir við punktum
    geom_smooth(method = 'lm', se = FALSE) + # Þetta bætir við lýsandi línu. LM er Linear Model (línuleg aðhvarfs)
    theme_apa() + # Breyta útlitinu á glugganum
    labs(x = 'Spönn', y = 'Hæð', title = 'Myndrit af Hæð eftir Spönn') # Breyta merkingum.

Simpson’s Paradox

Heyrðu nú mig! Svo virðist vera að það sé engin fylgni hjá KVK en mikil fylgni hjá KK. Gæti verið að við séum að sjá lifandi dæmi um Simpson’s Paradox. Simpson’s Paradox fjallar um tilvik þegar maður heldur að það sé ákveðið samband milli breyta, en svo skiptir maður þeim upp eftir hópum og fær allt annað samband. Þá er væntanlega einhver þriðja breyta (í þessu tilviki kyn) að hafa áhrif!

Kassarit

df %>%
    gather(maelingartegund, maeling, # Býr til breytuna maelingartegund og tölubreytuna maeling
           haed, sponn) %>%         # Úr breytunum hér til vinstri
    ggplot(aes(kyn, maeling, fill = kyn)) + # Teikna rammann og segja hvaða gögn ég ætla að teikna
    geom_boxplot() + # Teikna kassarit
    theme_apa() + # Setja APA útlit
    facet_wrap(~ maelingartegund, scales = 'free') + # Ég vil fá eina mynd fyrir hverja mælingartegund (haed/sponn)
    labs(x = 'Kyn', y = 'Mæling', title = 'Kassarit af Hæð/Spönn eftir Kyni') # Merkingar

Súlurit

df %>%
    gather(maelingartegund, maeling, # Býr til breytuna maelingartegund og tölubreytuna maeling
           haed, sponn) %>%         # Úr breytunum hér til vinstri
    ggplot(aes(maeling)) +  # Teikna rammann og segja hvaða gögn ég ætla að teikna
    geom_histogram(bins = 15) +
    facet_wrap(~ maelingartegund, scales = 'free') + # Ég vil fá eina mynd fyrir hverja mælingartegund (haed/sponn)
    theme_apa() + # Setja APA útlit
    labs(x = 'Mæling', y = 'Fjöldi', title = 'Stöplarit af mælingum')

Normaldreyfast mælinganar?

df %>%
    gather(maelingartegund, maeling, # Býr til breytuna maelingartegund og tölubreytuna maeling
           haed, sponn) %>%         # Úr breytunum hér til vinstri
    ggplot(aes(maeling, fill = kyn)) + # Teikna rammann og segja hvaða gögn ég ætla að teikna
    geom_density(alpha = 0.6) + # Teiknar dreyfingu gagnanna. 
    facet_wrap(~ maelingartegund, scales = 'free') + #
    theme_apa() + 
    labs(x = 'Mæling', y = 'Fjöldi', title = 'Dreyfingar mælinga')

Dreifigreining

Hæð eftir kyni

require(broom)

kyn_haed_anova <- aov(haed ~ kyn, data = df)
nidurstodur <- tidy(kyn_haed_anova)
kable(
    nidurstodur,
      digits = 3)
term df sumsq meansq statistic p.value
kyn 1 506.807 506.807 10.049 0.005
Residuals 20 1008.648 50.432 NA NA

Spönn efir kyni

kyn_sponn_anova <- aov(sponn ~ kyn, data = df)
nidurstodur <- tidy(kyn_sponn_anova)
kable(
    nidurstodur,
    digits = 3
)
term df sumsq meansq statistic p.value
kyn 1 69.160 69.160 29.651 0
Residuals 20 46.649 2.332 NA NA

Hæð eftir Coolguy?

coolguy_haed_anova <- aov(haed ~ `Coolguy?`, data = df)
nidurstodur <- tidy(coolguy_haed_anova)
kable(
    nidurstodur,
    digits = 3
)
term df sumsq meansq statistic p.value
Coolguy? 1 1.188 1.188 0.016 0.902
Residuals 20 1514.267 75.713 NA NA

Það er greinilega ekki munur á hæð fólks eftir því hvort það sé Coolguy eða ekki!

Þáttagreining

Fyrst þurfum við að breyta gögnunu yfir á talnaform. Það er ekki hægt að framkvæma þáttagreiningu á breytuna kyn eins og er t.d.

require(ggbiplot) # Pakki eftir algjöran nörda sem gerir þáttagreiningarmyndrit

df %>%
    mutate(coolguy = ifelse(`Coolguy?` == 'Yes!', 1, 0), # Breyta coolguy á talnaform
           karl = ifelse(kyn == 'KK', 1, 0)) %>% # Breyta kyn á talnaform
    select(haed, sponn, coolguy, karl) %>% # Velja bara þessar breytur
    prcomp(., center = TRUE, scale. = TRUE) -> thattgrein_df # Framkvæma þáttagreiningu (Principal Components Analysis)

thattgrein_df
## Standard deviations (1, .., p=4):
## [1] 1.5169822 1.0058836 0.6891084 0.4605351
## 
## Rotation (n x k) = (4 x 4):
##                 PC1         PC2          PC3         PC4
## haed    -0.53591714  0.03680467  0.843145859 -0.02330876
## sponn   -0.59922486 -0.07131098 -0.358067586  0.71248292
## coolguy -0.04943413 -0.98936209  0.007990264 -0.13658361
## karl    -0.59268766  0.12133763 -0.401034687 -0.68787332
ggbiplot(thattgrein_df, ellipse = TRUE, groups = df$kyn) +  # Teikna þáttagreininguna
    theme_apa() + ggtitle('Tveir Fyrstu Þættirnir í Þáttagreiningunni')

Sjáum að breyturnar karl, haed og sponn virðast útskýra mjög svipaða hluti og hlaða saman á þátt 1. Coolguy er mjög ólík þeim breytum og hleður mest á þátt nr. 2.

Vista tilbúið gagnasafn

Öll gögn eru komin þ.a. ég ætla að undirbúa gagnasafnið og vista það

df %>%
    mutate(karl = ifelse(kyn == 'KK', 1, 0)) %>%
    select(karl, haed, sponn) %>%
    write_csv('verkefni2gagnasafn.csv')