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!
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 |
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! |
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! |
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!
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.
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.
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!
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
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')
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')
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 |
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 |
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!
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.
Ö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')