library(haven)
df<-read_sav("C:/Users/Admin/Documents/База_КлимРиск_2023.sav")
library(dplyr)
##
## Присоединяю пакет: 'dplyr'
## Следующие объекты скрыты от 'package:stats':
##
## filter, lag
## Следующие объекты скрыты от 'package:base':
##
## intersect, setdiff, setequal, union
df<-df %>%
rowwise() %>%
mutate(V18_mean=mean(c_across(starts_with("V18")), na.rm = TRUE))
hist(df$V18_mean, col="steelblue")
Перекодируем переменную по образованию в 2 группы
df<-df %>%
mutate(V6_obr=case_when(
V6<=3 ~ "Без высшего образования",
V6==4 | V6==5 ~ "С высшим образованием"
))
Ответы по поводу уверенности в нахождении заработка
df<-df %>%
mutate(V21_not=case_when(
V21==5 ~ NA,
V21==99 ~ NA,
.default=as.integer(V21)
))
Тест Манна-Уитни
wilcox.test(V21_not~V6_obr, data = df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: V21_not by V6_obr
## W = 43706, p-value = 0.03438
## alternative hypothesis: true location shift is not equal to 0
Рассмотрим результаты теста по критерию Мана-Уитни. Они показывают, что между выборками есть статистически значимые различия. Визуализируем
library(ggstatsplot)
## You can cite this package as:
## Patil, I. (2021). Visualizations with statistical details: The 'ggstatsplot' approach.
## Journal of Open Source Software, 6(61), 3167, doi:10.21105/joss.03167
ggbetweenstats(df, V6_obr, V21_not, xlab = "Образование", type="nonparametric")
Количество уверенных и неуверенных примерно одинаково.
library(car)
## Загрузка требуемого пакета: carData
##
## Присоединяю пакет: 'car'
## Следующий объект скрыт от 'package:dplyr':
##
## recode
df<-df %>%
mutate(V10_bogat=case_when(
V10<=2 ~ "низкие доходы",
V10==3 ~ "средние доходы",
V10>=4 ~ "высокие доходы"
))
Сравним важность соблюдения традиций и образование с использованием t-тест
leveneTest(V18_3~V6_obr, data = df)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 0.6404 0.4238
## 840
t.test(V18_3~V6_obr, data = df)
##
## Welch Two Sample t-test
##
## data: V18_3 by V6_obr
## t = 0.78894, df = 740.15, p-value = 0.4304
## alternative hypothesis: true difference in means between group Без высшего образования and group С высшим образованием is not equal to 0
## 95 percent confidence interval:
## -0.07070283 0.16570929
## sample estimates:
## mean in group Без высшего образования mean in group С высшим образованием
## 3.458947 3.411444
Принимается нулевая гипотеза об отсутствии различий. Сравним важность соблюдения традиций и материального положения
kruskal.test(V18_3 ~ V10_bogat, data = df)
##
## Kruskal-Wallis rank sum test
##
## data: V18_3 by V10_bogat
## Kruskal-Wallis chi-squared = 13.604, df = 2, p-value = 0.001112
pairwise.wilcox.test(df$V18_3, df$V10_bogat, p.adjust.method = "BH")
##
## Pairwise comparisons using Wilcoxon rank sum test with continuity correction
##
## data: df$V18_3 and df$V10_bogat
##
## высокие доходы низкие доходы
## низкие доходы 0.0015 -
## средние доходы 0.0199 0.0182
##
## P value adjustment method: BH
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ ggplot2 3.5.1 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.4 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ car::recode() masks dplyr::recode()
## ✖ purrr::some() masks car::some()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rstatix)
##
## Присоединяю пакет: 'rstatix'
##
## Следующий объект скрыт от 'package:stats':
##
## filter
library(ggpubr)
library(datarium)
Загрузка данных
data("selfesteem")
head(selfesteem)
## # A tibble: 6 × 4
## id t1 t2 t3
## <int> <dbl> <dbl> <dbl>
## 1 1 4.01 5.18 7.11
## 2 2 2.56 6.91 6.31
## 3 3 3.24 4.44 9.78
## 4 4 3.42 4.71 8.35
## 5 5 2.87 3.91 6.46
## 6 6 2.05 5.34 6.65
Преобразование данных в длинный формат
selfesteem_long <- selfesteem %>%
pivot_longer(
cols = c(t1, t2, t3),
names_to = "time",
values_to = "score"
) %>%
convert_as_factor(id, time)
Описательные статистики
desc_stats <- selfesteem_long %>%
group_by(time) %>%
get_summary_stats(score, type = "mean_sd")
desc_stats
## # A tibble: 3 × 5
## time variable n mean sd
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 t1 score 10 3.14 0.552
## 2 t2 score 10 4.93 0.863
## 3 t3 score 10 7.64 1.14
Визуализация данных
boxplot <- ggboxplot(selfesteem_long, x = "time", y = "score",
color = "time", palette = "jco",
add = "jitter") +
labs(title = "Оценка самооценки по временным точкам",
x = "Временная точка", y = "Оценка самооценки")
boxplot
Проверка нормальности распределения
normality_test <- selfesteem_long %>%
group_by(time) %>%
shapiro_test(score)
normality_test
## # A tibble: 3 × 4
## time variable statistic p
## <fct> <chr> <dbl> <dbl>
## 1 t1 score 0.967 0.859
## 2 t2 score 0.876 0.117
## 3 t3 score 0.923 0.380
Графическая проверка нормальности
qqplot <- ggqqplot(selfesteem_long, "score", facet.by = "time") +
labs(title = "Графики Q-Q для проверки нормальности")
qqplot
Параметрический анализ (ANOVA с повторными измерениями)
Проведение ANOVA
res.aov <- anova_test(data = selfesteem_long, dv = score,
wid = id, within = time)
anova_results <- get_anova_table(res.aov)
anova_results
## ANOVA Table (type III tests)
##
## Effect DFn DFd F p p<.05 ges
## 1 time 2 18 55.469 2.01e-08 * 0.829
Парные сравнения с поправкой Бонферрони
pwc_param <- selfesteem_long %>%
pairwise_t_test(
score ~ time, paired = TRUE,
p.adjust.method = "bonferroni"
)
pwc_param
## # A tibble: 3 × 10
## .y. group1 group2 n1 n2 statistic df p p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 score t1 t2 10 10 -4.97 9 0.000772 2e-3 **
## 2 score t1 t3 10 10 -13.2 9 0.000000334 1e-6 ****
## 3 score t2 t3 10 10 -4.87 9 0.000886 3e-3 **
Визуализация с результатами параметрического анализа
param_plot <- boxplot +
stat_pvalue_manual(
pwc_param %>% add_xy_position(x = "time"),
step.increase = 0.1
) +
labs(
subtitle = get_test_label(res.aov, detailed = TRUE),
caption = get_pwc_label(pwc_param)
)
param_plot
Непараметрический анализ (тест Фридмана)
Тест Фридмана
friedman_test <- selfesteem_long %>%
friedman_test(score ~ time | id)
friedman_test
## # A tibble: 1 × 6
## .y. n statistic df p method
## * <chr> <int> <dbl> <dbl> <dbl> <chr>
## 1 score 10 18.2 2 0.000112 Friedman test
Парные сравнения (знаковый ранговый тест Вилкоксона с поправкой)
pwc_nonparam <- selfesteem_long %>%
pairwise_wilcox_test(
score ~ time, paired = TRUE,
p.adjust.method = "bonferroni"
)
pwc_nonparam
## # A tibble: 3 × 9
## .y. group1 group2 n1 n2 statistic p p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <chr>
## 1 score t1 t2 10 10 0 0.002 0.006 **
## 2 score t1 t3 10 10 0 0.002 0.006 **
## 3 score t2 t3 10 10 1 0.004 0.012 *
Визуализация с результатами непараметрического анализа
nonparam_plot <- boxplot +
stat_pvalue_manual(
pwc_nonparam %>% add_xy_position(x = "time"),
step.increase = 0.1
) +
labs(
subtitle = paste0("Тест Фридмана: χ²(", friedman_test$df, ") = ",
round(friedman_test$statistic, 2),
", p = ", round(friedman_test$p, 3)),
caption = get_pwc_label(pwc_nonparam)
)
nonparam_plot
Альтернативная визуализация с линиями соединения
lineplot <- ggline(selfesteem_long, x = "time", y = "score",
group = "id", color = "gray", alpha = 0.5) +
stat_summary(aes(group = 1), fun = mean, geom = "line",
color = "red", size = 1.5) +
stat_summary(fun.data = mean_se, geom = "errorbar",
width = 0.1, color = "red") +
stat_summary(fun = mean, geom = "point",
color = "red", size = 3) +
labs(title = "Изменение самооценки по временным точкам",
x = "Временная точка", y = "Оценка самооценки",
caption = "Красная линия показывает средние значения")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
lineplot
Вывод всех графиков
gridExtra::grid.arrange(boxplot, qqplot, param_plot, nonparam_plot, lineplot, ncol = 2)
library(vcd)
## Загрузка требуемого пакета: grid
options(OutDec= ",")
создадим базовую таблицу
M<- table(df$V25, df$V1)
names(dimnames(M)) = c("Ухудшилось ли Ваше здоровье в последнее время?","Пол")
labs <- round(prop.table(M,margin=2)*100, 1)
mosaic(M, pop = FALSE, shade = TRUE)
labeling_cells(text = labs, margin = 0)(M)
struct <- structable(~ V25 + V1, data = df)
assoc(struct, data = df, shade=T, labeling_args = list(set_varnames = c(V1 = "Пол", V25="Ухудшилось ли Ваше здоровье в последнее время?")))
library(vcd)
options(OutDec= ",")
M<- table(df$V10, df$V1)
names(dimnames(M)) = c("Каков уровень материального достатка Вашей семьи?","Пол")
labs <- round(prop.table(M,margin=2)*100, 1)
mosaic(M, pop = FALSE, shade = TRUE)
labeling_cells(text = labs, margin = 0)(M)
struct <- structable(~ V10 + V1, data = df)
assoc(struct, data = df, shade=T, labeling_args = list(set_varnames = c(V1 = "Пол", V10="Каков уровень материального достатка Вашей семьи?")))