library(tidyverse) # Načteme si tato data df <- read_csv2("https://is.muni.cz/el/fss/podzim2024/PSYb2320/um/datasets/personality_all.csv", na = c("", "-99", "0")) df %>% distinct(gender, class) # Jak bychom proměnnou gender převedli na faktor? # Převod gender na factor df <- df %>% mutate( gender = factor(gender, levels = c("M", "F"), labels = c("Boy", "Girl")) ) # Jak bychom převrátili reverzní položky bez / s přepsáním původních sloupců? # Máme k dispozici vektor s názvy reverzních položek reversed_items <- c( str_c("nfc_", 10:16), str_c("ipip_", str_pad(c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 29, 30, 32, 34, 36, 38, 39, 44, 46, 49), width = 2, pad = 0)) ) # A práci nám usnadňuje to, že všechny položky měly pětibodovou odpovědní škálu df_rev <- df %>% mutate( across( all_of(reversed_items), ~6 - .x, .names = "{.col}_r" ) ) names(df_rev) df_rev <- df %>% mutate( across( all_of(reversed_items), ~6 - .x ) ) names(df_rev) # Jak bychom mohli vytvořit funkci, která bude vytvářet názvy položek? item_range <- function(prefix, num_range, width = 2) { str_c(prefix, str_pad(num_range, pad = 0, width = width)) } # Jak bychom vytvořili list s názvy položek každé škály? # NFC: 1 až 16 # Extraversion: 1 6 11 16 21 26 31 36 41 46 # Agreeableness: 2 7 12 17 22 27 32 37 42 47 # Conscientiousness: 3 8 13 18 23 28 33 38 43 48 # Emotional stability: 4 9 14 19 24 29 34 39 44 49 # Intellect: 5 10 15 20 25 30 35 40 45 50 # Když máme list z položkami items <- list( nfc = item_range("nfc_", 1:16), bfi_ext = item_range("ipip_", seq(1, 50, by = 5)), bfi_agr = item_range("ipip_", seq(2, 50, by = 5)), bfi_con = item_range("ipip_", seq(3, 50, by = 5)), bfi_est = item_range("ipip_", seq(4, 50, by = 5)), bfi_int = item_range("ipip_", seq(5, 50, by = 5)) ) # Jak bychom mohli vytvořit funkci, která bude počítat průměry položek # vstupní argumenty: data, položky item_mean <- function(data, items) { data %>% select(all_of(items)) %>% rowMeans(na.rm = TRUE) } item_mean(df, items = items$nfc) # Jak bychom mohli vytvořit funkci, která bude počítat průměry položek # vstupní argumenty: data, položky, maximální počet missing values item_mean <- function(data, items, max.na) { data <- data %>% select(all_of(items)) n_miss <- data %>% is.na() %>% rowSums() out <- data %>% rowMeans(na.rm = TRUE) out[n_miss > max.na] <- NA out } # Jak bychom tuto funkci mohli nyní použít k výpočtu celkových skórů každé škály item_mean(df_rev, items = items$nfc, max.na = 2) totals <- items %>% map(~item_mean(data = df_rev, items = .x, max.na = 2)) %>% bind_cols() totals # Co kdybychom ještě chtěli měnit i hodnoty argumentu max.na max.na <- c(2, rep(1, 5)) max.na totals <- items %>% map(~item_mean(data = df_rev, items = .x, max.na = 2)) %>% bind_cols() map2( items, max.na, ~item_mean(data = df_rev, items = ..1, max.na = ..2) ) %>% bind_cols() df <- bind_cols(df, totals) df <- df %>% relocate( all_of(colnames(totals)), .after = class ) # Jak bychom převedli data do longer formátu, aby hodnoty proměnných nfc až # bfi_int byly v jednom sloupci? long <- df %>% pivot_longer(nfc:bfi_int, names_to = "variable", values_to = "value") long # Jak bychom vytvořili funkci, která bude počítat průměr + interval spolehlivosti mean_ci <- function(x, level = .95) { x <- x[!is.na(x)] m <- mean(x) s <- sd(x) n <- length(x) df <- n - 1 se <- s/sqrt(n) alpha <- 1 - level q <- qt(1 - alpha/2, df = df) me <- se*q tibble( m = m, ci_lower = m - me, ci_upper = m + me ) } # Jak bychom tuto funkci mohli použít pro výpočet souhrnných statistik # podle ročníku a pohlaví? group_means <- long %>% group_by(grade, gender, variable) %>% summarise(mean_ci(value)) # Jak bychom výsledky znázornili graficky p <- position_dodge(width = .2) group_means %>% ggplot(aes(x = grade, y = m, ymin = ci_lower, ymax = ci_upper, color = gender)) + geom_pointrange(position = p) + geom_line(position = p, aes(group = gender)) + facet_wrap(~variable) + scale_color_manual(values = c("blue", "red"))