1 Загрузка библиотек

# При отсутствии пакетов раскомментируйте установку
# install.packages(c("readxl","dplyr","tidyr","ggplot2","ggpubr","broom",
#                    "knitr","kableExtra","purrr","tibble","rlang","scales"))

library(readxl)
library(dplyr)
library(tidyr)
library(tibble)
library(purrr)
library(rlang)
library(ggplot2)
library(ggpubr)
library(broom)
library(knitr)
library(kableExtra)
library(scales)

theme_set(theme_bw(base_size = 12))

2 Загрузка и подготовка данных

Данные из листа total_data файла 2026-06-30_Manual_vs_auto.xlsx. В каждой строке — один объект (комета), измеренный либо вручную (manual), либо автоматически (auto); поле Comet_Image служит идентификатором, парная нумерация совпадает между методами.

# Путь к файлу — в той же папке, что и .Rmd
data_file <- "Data/2026-06-30_Manual_vs_auto.xlsx"

raw <- read_excel(data_file, sheet = "total_data")

# Приводим типы, чистим служебные пустые колонки
dat <- raw %>%
  select(-any_of("...20")) %>%                # если есть пустой хвост
  mutate(
    Method = factor(Method, levels = c("manual", "auto")),
    Comet_Image = as.integer(Comet_Image)
  )

# Список числовых параметров для анализа
params <- c(
  "Comet_Length_px", "Comet_Height_px", "Comet_Area",
  "Comet_Intensity", "Comet_Mean_Intensity",
  "Head_Diameter_px", "Head_Area_px", "Head_Intensity",
  "Head_Mean_Intensity", "Head_DNA_%",
  "Tail_Length_px", "Tail_Area_px", "Tail_Intensity",
  "Tail_Mean_Intensity", "Tail_DNA_%", "Tail_Moment"
)
params <- intersect(params, names(dat))

glimpse(dat)
## Rows: 24
## Columns: 19
## $ Method               <fct> manual, manual, manual, manual, manual, manual, m…
## $ Comet_Image          <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4…
## $ Comet_Probability    <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0…
## $ Comet_Length_px      <dbl> 41.700, 41.900, 38.100, 39.900, 40.600, 44.500, 2…
## $ Comet_Height_px      <dbl> 25.984, 27.625, 21.065, 27.098, 20.998, 28.102, 1…
## $ Comet_Area           <dbl> 769, 798, 582, 762, 557, 891, 370, 321, 292, 365,…
## $ Comet_Intensity      <dbl> 73469, 77511, 50446, 74203, 50000, 82989, 13072, …
## $ Comet_Mean_Intensity <dbl> 95.53800, 97.13200, 86.67700, 97.37900, 89.76700,…
## $ Head_Diameter_px     <dbl> 5.863, 6.513, 3.908, 6.014, 4.863, 4.689, 12.230,…
## $ Head_Area_px         <dbl> 32, 34, 16, 21, 12, 32, 156, 192, 124, 151, 166, …
## $ Head_Intensity       <dbl> 2562, 3013, 1111, 1956, 666, 2326, 6561, 13840, 8…
## $ Head_Mean_Intensity  <dbl> 80.06200, 88.61800, 69.43800, 93.14300, 55.50000,…
## $ `Head_DNA_%`         <dbl> 3.487185, 3.887190, 2.202355, 2.636012, 1.332000,…
## $ Tail_Length_px       <dbl> 34.573, 35.213, 32.738, 36.275, 35.826, 39.099, 1…
## $ Tail_Area_px         <dbl> 695, 748, 486, 715, 517, 821, 170, 152, 149, 181,…
## $ Tail_Intensity       <dbl> 68165, 73049, 45485, 70564, 47534, 78764, 5367, 6…
## $ Tail_Mean_Intensity  <dbl> 98.07900, 97.65900, 93.59100, 98.69100, 91.94200,…
## $ `Tail_DNA_%`         <dbl> 92.78063, 94.24340, 90.16572, 95.09589, 95.06800,…
## $ Tail_Moment          <dbl> 32.077047, 33.185928, 29.518454, 34.496033, 34.05…

Формируем длинный и широкий (парный) формат:

dat_long <- dat %>%
  select(Method, Comet_Image, all_of(params)) %>%
  pivot_longer(cols = all_of(params),
               names_to = "Parameter",
               values_to = "Value") %>%
  mutate(Parameter = factor(Parameter, levels = params))

dat_wide <- dat %>%
  select(Method, Comet_Image, all_of(params)) %>%
  pivot_longer(cols = all_of(params),
               names_to = "Parameter",
               values_to = "Value") %>%
  pivot_wider(names_from = Method, values_from = Value) %>%
  mutate(Parameter = factor(Parameter, levels = params),
         diff = auto - manual)

3 Описательная статистика

Сводка по методам (n, среднее, SD, медиана, IQR, min–max):

desc_stats <- dat_long %>%
  group_by(Parameter, Method) %>%
  summarise(
    n      = sum(!is.na(Value)),
    mean   = mean(Value, na.rm = TRUE),
    sd     = sd(Value,   na.rm = TRUE),
    median = median(Value, na.rm = TRUE),
    Q1     = quantile(Value, 0.25, na.rm = TRUE),
    Q3     = quantile(Value, 0.75, na.rm = TRUE),
    min    = min(Value, na.rm = TRUE),
    max    = max(Value, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 3)))

desc_stats %>%
  kable(caption = "Описательная статистика по методам") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Описательная статистика по методам
Parameter Method n mean sd median Q1 Q3 min max
Comet_Length_px manual 12 33.506 8.253 33.344 26.949 40.875 22.001 44.500
Comet_Length_px auto 12 34.583 9.765 34.000 26.750 43.250 21.000 47.000
Comet_Height_px manual 12 19.535 6.303 18.500 13.502 26.262 13.010 28.102
Comet_Height_px auto 12 22.667 7.328 21.000 16.000 30.000 15.000 32.000
Comet_Area manual 12 516.583 239.094 463.500 313.750 763.750 245.000 891.000
Comet_Area auto 12 587.083 339.903 494.000 278.750 917.500 238.000 1022.000
Comet_Intensity manual 12 42060.083 28877.152 34543.500 16067.750 73652.500 13072.000 82989.000
Comet_Intensity auto 12 104911.333 79669.668 77906.500 33150.250 187054.000 23724.000 200671.000
Comet_Mean_Intensity manual 12 73.570 22.305 76.661 58.105 93.740 35.330 97.379
Comet_Mean_Intensity auto 12 156.322 45.050 159.027 117.575 198.039 90.924 204.878
Head_Diameter_px manual 12 9.856 4.866 9.372 5.613 14.756 3.908 15.572
Head_Diameter_px auto 12 10.333 3.393 10.000 8.000 14.000 4.000 14.000
Head_Area_px manual 12 92.750 73.284 79.000 29.250 158.500 12.000 192.000
Head_Area_px auto 12 98.000 59.115 86.000 48.000 153.000 18.000 184.000
Head_Intensity manual 12 6312.750 5000.883 4787.000 2233.500 10016.750 666.000 13840.000
Head_Intensity auto 12 13284.833 10121.434 9867.000 4826.000 22473.000 808.000 27794.000
Head_Mean_Intensity manual 12 71.327 13.910 72.158 67.178 78.452 42.058 93.143
Head_Mean_Intensity auto 12 117.990 35.988 117.085 97.860 151.741 44.889 168.938
Head_DNA_% manual 12 34.377 34.242 27.039 2.761 60.702 1.332 81.076
Head_DNA_% auto 12 36.846 36.627 32.339 2.553 69.698 0.687 83.238
Tail_Length_px manual 12 24.142 12.297 24.244 13.986 35.366 7.766 39.099
Tail_Length_px auto 12 24.250 12.779 26.000 13.750 35.250 7.000 39.000
Tail_Area_px manual 12 397.333 294.412 333.500 151.250 700.000 48.000 821.000
Tail_Area_px auto 12 489.083 393.185 407.000 135.250 870.000 67.000 970.000
Tail_Intensity manual 12 34370.000 32299.009 26133.500 5753.250 68764.750 2092.000 78764.000
Tail_Intensity auto 12 91626.500 88629.144 65499.500 8684.750 182228.000 5597.000 196143.000
Tail_Mean_Intensity manual 12 66.724 30.868 68.280 37.818 96.367 31.571 98.691
Tail_Mean_Intensity auto 12 139.967 67.232 145.995 80.440 204.109 46.594 210.668
Tail_DNA_% manual 12 61.971 34.111 65.611 36.463 94.410 12.812 95.096
Tail_DNA_% auto 12 63.154 36.627 67.661 30.302 97.447 16.762 99.313
Tail_Moment manual 12 18.779 15.452 17.992 5.100 33.404 1.143 37.108
Tail_Moment auto 12 19.537 16.607 19.792 4.530 34.821 1.173 38.120

4 Статистика парного сравнения методов

Для каждого параметра проводим:

  • проверку нормальности разностей (Shapiro–Wilk);
  • парный t-тест Стьюдента;
  • парный тест Уилкоксона (знаково-ранговый).

Итоговый выбор p-значения делается по нормальности разностей (если p_Shapiro < 0.05 — используется Уилкоксон, иначе — t-тест).

safe_shapiro <- function(x) {
  x <- x[is.finite(x)]
  if (length(x) < 3 || length(unique(x)) < 2) return(NA_real_)
  tryCatch(shapiro.test(x)$p.value, error = function(e) NA_real_)
}

safe_test <- function(d, method = c("t","wilcox")) {
  method <- match.arg(method)
  d <- d[is.finite(d)]
  if (length(d) < 3 || length(unique(d)) < 2) return(NA_real_)
  tryCatch({
    if (method == "t") t.test(d)$p.value
    else wilcox.test(d, exact = FALSE)$p.value
  }, error = function(e) NA_real_)
}

paired_tbl <- dat_wide %>%
  group_by(Parameter) %>%
  summarise(
    n_pairs      = sum(is.finite(manual) & is.finite(auto)),
    mean_manual  = mean(manual, na.rm = TRUE),
    mean_auto    = mean(auto,   na.rm = TRUE),
    mean_diff    = mean(diff,   na.rm = TRUE),
    sd_diff      = sd(diff,     na.rm = TRUE),
    p_Shapiro    = safe_shapiro(diff),
    p_ttest      = safe_test(diff, "t"),
    p_wilcoxon   = safe_test(diff, "wilcox"),
    .groups      = "drop"
  ) %>%
  mutate(
    test_choice = ifelse(is.na(p_Shapiro) | p_Shapiro < 0.05,
                         "Wilcoxon (парный)", "t-test (парный)"),
    p_value     = ifelse(is.na(p_Shapiro) | p_Shapiro < 0.05,
                         p_wilcoxon, p_ttest),
    signif = cut(p_value,
                 breaks = c(-Inf, 0.001, 0.01, 0.05, Inf),
                 labels = c("***","**","*","ns"))
  ) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4)))

paired_tbl %>%
  kable(caption = "Парное сравнение методов (manual vs. auto)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Парное сравнение методов (manual vs. auto)
Parameter n_pairs mean_manual mean_auto mean_diff sd_diff p_Shapiro p_ttest p_wilcoxon test_choice p_value signif
Comet_Length_px 12 33.5062 34.5833 1.0771 1.7795 0.1050 0.0599 0.0774 t-test (парный) 0.0599 ns
Comet_Height_px 12 19.5348 22.6667 3.1318 2.0916 0.0045 0.0003 0.0025 Wilcoxon (парный) 0.0025 **
Comet_Area 12 516.5833 587.0833 70.5000 131.5305 0.5299 0.0903 0.1261 t-test (парный) 0.0903 ns
Comet_Intensity 12 42060.0833 104911.3333 62851.2500 52157.7249 0.0080 0.0016 0.0025 Wilcoxon (парный) 0.0025 **
Comet_Mean_Intensity 12 73.5705 156.3223 82.7518 23.6072 0.2152 0.0000 0.0025 t-test (парный) 0.0000 ***
Head_Diameter_px 12 9.8562 10.3333 0.4771 1.8434 0.1992 0.3892 0.4561 t-test (парный) 0.3892 ns
Head_Area_px 12 92.7500 98.0000 5.2500 23.0498 0.1598 0.4468 0.3462 t-test (парный) 0.4468 ns
Head_Intensity 12 6312.7500 13284.8333 6972.0833 5340.1544 0.1634 0.0009 0.0033 t-test (парный) 0.0009 ***
Head_Mean_Intensity 12 71.3273 117.9902 46.6629 39.9580 0.2114 0.0019 0.0068 t-test (парный) 0.0019 **
Head_DNA_% 12 34.3771 36.8463 2.4692 7.8685 0.1993 0.3003 0.6661 t-test (парный) 0.3003 ns
Tail_Length_px 12 24.1417 24.2500 0.1083 1.6878 0.3187 0.8281 0.9063 t-test (парный) 0.8281 ns
Tail_Area_px 12 397.3333 489.0833 91.7500 120.3360 0.1029 0.0229 0.0544 t-test (парный) 0.0229
Tail_Intensity 12 34370.0000 91626.5000 57256.5000 57363.6179 0.0043 0.0054 0.0025 Wilcoxon (парный) 0.0025 **
Tail_Mean_Intensity 12 66.7238 139.9674 73.2435 38.3387 0.0843 0.0000 0.0025 t-test (парный) 0.0000 ***
Tail_DNA_% 12 61.9714 63.1537 1.1824 5.5875 0.0548 0.4789 0.3670 t-test (парный) 0.4789 ns
Tail_Moment 12 18.7794 19.5368 0.7574 2.0190 0.2097 0.2203 0.2896 t-test (парный) 0.2203 ns

5 Визуализация: boxplot + точки (парные сравнения)

Для каждого параметра — boxplot по методам с наложенными точками и линиями, соединяющими парные наблюдения одной и той же кометы. p-значение приведено по итоговому выбранному тесту.

make_pair_plot <- function(param) {

  df <- dat_wide %>% filter(Parameter == param)
  df_long <- df %>%
    pivot_longer(cols = c(manual, auto),
                 names_to = "Method", values_to = "Value") %>%
    mutate(Method = factor(Method, levels = c("manual","auto")))

  info <- paired_tbl %>% filter(Parameter == param)
  pval <- info$p_value
  test <- info$test_choice
  p_lbl <- if (is.na(pval)) "p = н/д" else {
    if (pval < 0.001) "p < 0.001" else paste0("p = ", format(round(pval, 3), nsmall = 3))
  }

  ggplot(df_long, aes(x = Method, y = Value)) +
    geom_boxplot(aes(fill = Method), width = 0.5,
                 outlier.shape = NA, alpha = 0.35) +
    geom_line(aes(group = Comet_Image),
              colour = "grey55", linewidth = 0.3, alpha = 0.7) +
    geom_point(aes(colour = Method), size = 2.2, alpha = 0.9) +
    scale_fill_manual(values = c(manual = "#1f78b4", auto = "#e31a1c")) +
    scale_colour_manual(values = c(manual = "#1f78b4", auto = "#e31a1c")) +
    labs(title = param,
         subtitle = paste0(test, ": ", p_lbl),
         x = NULL, y = param) +
    theme(legend.position = "none",
          plot.title = element_text(face = "bold"))
}

for (p in params) {
  cat("\n\n## ", p, "\n\n", sep = "")
  print(make_pair_plot(p))
}

5.1 Comet_Length_px

5.2 Comet_Height_px

5.3 Comet_Area

5.4 Comet_Intensity

5.5 Comet_Mean_Intensity

5.6 Head_Diameter_px

5.7 Head_Area_px

5.8 Head_Intensity

5.9 Head_Mean_Intensity

5.10 Head_DNA_%

5.11 Tail_Length_px

5.12 Tail_Area_px

5.13 Tail_Intensity

5.14 Tail_Mean_Intensity

5.15 Tail_DNA_%

5.16 Tail_Moment

6 Регрессионный анализ (auto ~ manual)

Для каждого параметра оценивается линейная регрессия auto = β0 + β1 · manual. На графике приводятся уравнение регрессии и коэффициент детерминации (а также p-значение для наклона). Пунктирная линия — идентичность y = x.

fit_one <- function(param) {
  df <- dat_wide %>% filter(Parameter == param) %>%
    filter(is.finite(manual), is.finite(auto))
  if (nrow(df) < 3) return(NULL)
  fit <- lm(auto ~ manual, data = df)
  gl  <- broom::glance(fit)
  td  <- broom::tidy(fit)
  tibble(
    Parameter = param,
    n         = nrow(df),
    intercept = td$estimate[td$term == "(Intercept)"],
    slope     = td$estimate[td$term == "manual"],
    R2        = gl$r.squared,
    adj_R2    = gl$adj.r.squared,
    p_slope   = td$p.value[td$term == "manual"],
    RSE       = gl$sigma
  )
}

reg_tbl <- map_dfr(params, fit_one) %>%
  mutate(across(where(is.numeric), ~ round(.x, 4)))

reg_tbl %>%
  kable(caption = "Параметры линейной регрессии auto ~ manual") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Параметры линейной регрессии auto ~ manual
Parameter n intercept slope R2 adj_R2 p_slope RSE
Comet_Length_px 12 -4.8449 1.1767 0.9891 0.9880 0.0000 1.0690
Comet_Height_px 12 0.7739 1.1207 0.9293 0.9222 0.0000 2.0434
Comet_Area 12 -115.0550 1.3592 0.9141 0.9055 0.0000 104.4846
Comet_Intensity 12 -7584.4267 2.6746 0.9398 0.9338 0.0000 20494.4758
Comet_Mean_Intensity 12 10.6826 1.9796 0.9606 0.9567 0.0000 9.3744
Head_Diameter_px 12 3.7158 0.6714 0.9269 0.9196 0.0000 0.9622
Head_Area_px 12 26.0373 0.7759 0.9252 0.9177 0.0000 16.9612
Head_Intensity 12 798.2043 1.9780 0.9551 0.9506 0.0000 2248.6202
Head_Mean_Intensity 12 137.9026 -0.2792 0.0116 -0.0872 0.7385 37.5241
Head_DNA_% 12 0.8989 1.0457 0.9557 0.9512 0.0000 8.0879
Tail_Length_px 12 -0.6293 1.0306 0.9834 0.9818 0.0000 1.7258
Tail_Area_px 12 -30.7233 1.3082 0.9596 0.9556 0.0000 82.8850
Tail_Intensity 12 -749.9035 2.6877 0.9594 0.9553 0.0000 18735.7175
Tail_Mean_Intensity 12 -0.1910 2.1006 0.9302 0.9232 0.0000 18.6350
Tail_DNA_% 12 -2.7257 1.0631 0.9802 0.9782 0.0000 5.4085
Tail_Moment 12 -0.5383 1.0690 0.9893 0.9883 0.0000 1.7983
make_reg_plot <- function(param) {

  df <- dat_wide %>% filter(Parameter == param) %>%
    filter(is.finite(manual), is.finite(auto))
  if (nrow(df) < 3) return(NULL)

  fit <- lm(auto ~ manual, data = df)
  cf  <- coef(fit)
  r2  <- summary(fit)$r.squared
  pv  <- summary(fit)$coefficients["manual", "Pr(>|t|)"]
  sgn <- ifelse(cf[2] >= 0, " + ", " - ")
  eq  <- sprintf("y = %.3f%s%.3f · x",
                 cf[1], sgn, abs(cf[2]))
  r2s <- sprintf("R² = %.3f", r2)
  ps  <- if (pv < 0.001) "p < 0.001" else sprintf("p = %.3f", pv)

  rng <- range(c(df$manual, df$auto), na.rm = TRUE)

  ggplot(df, aes(x = manual, y = auto)) +
    geom_abline(slope = 1, intercept = 0,
                linetype = "dashed", colour = "grey55") +
    geom_smooth(method = "lm", se = TRUE,
                colour = "#e31a1c", fill = "#fbb4ae", alpha = 0.4) +
    geom_point(size = 2.4, colour = "#1f78b4", alpha = 0.9) +
    coord_equal(xlim = rng, ylim = rng) +
    labs(title = param,
         subtitle = paste(eq, "  |  ", r2s, "  |  ", ps),
         x = paste0(param, " (manual)"),
         y = paste0(param, " (auto)")) +
    theme(plot.title = element_text(face = "bold"))
}

for (p in params) {
  plt <- make_reg_plot(p)
  if (!is.null(plt)) {
    cat("\n\n## ", p, "\n\n", sep = "")
    print(plt)
  }
}

6.1 Comet_Length_px

6.2 Comet_Height_px

6.3 Comet_Area

6.4 Comet_Intensity

6.5 Comet_Mean_Intensity

6.6 Head_Diameter_px

6.7 Head_Area_px

6.8 Head_Intensity

6.9 Head_Mean_Intensity

6.10 Head_DNA_%

6.11 Tail_Length_px

6.12 Tail_Area_px

6.13 Tail_Intensity

6.14 Tail_Mean_Intensity

6.15 Tail_DNA_%

6.16 Tail_Moment

7 Сводный вывод

summary_out <- paired_tbl %>%
  select(Parameter, n_pairs, mean_manual, mean_auto,
         mean_diff, test_choice, p_value, signif) %>%
  left_join(reg_tbl %>% select(Parameter, slope, intercept, R2, p_slope),
            by = "Parameter")

summary_out %>%
  kable(caption = "Итог: сравнение методов и линейная связь auto~manual") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Итог: сравнение методов и линейная связь auto~manual
Parameter n_pairs mean_manual mean_auto mean_diff test_choice p_value signif slope intercept R2 p_slope
Comet_Length_px 12 33.5062 34.5833 1.0771 t-test (парный) 0.0599 ns 1.1767 -4.8449 0.9891 0.0000
Comet_Height_px 12 19.5348 22.6667 3.1318 Wilcoxon (парный) 0.0025 ** 1.1207 0.7739 0.9293 0.0000
Comet_Area 12 516.5833 587.0833 70.5000 t-test (парный) 0.0903 ns 1.3592 -115.0550 0.9141 0.0000
Comet_Intensity 12 42060.0833 104911.3333 62851.2500 Wilcoxon (парный) 0.0025 ** 2.6746 -7584.4267 0.9398 0.0000
Comet_Mean_Intensity 12 73.5705 156.3223 82.7518 t-test (парный) 0.0000 *** 1.9796 10.6826 0.9606 0.0000
Head_Diameter_px 12 9.8562 10.3333 0.4771 t-test (парный) 0.3892 ns 0.6714 3.7158 0.9269 0.0000
Head_Area_px 12 92.7500 98.0000 5.2500 t-test (парный) 0.4468 ns 0.7759 26.0373 0.9252 0.0000
Head_Intensity 12 6312.7500 13284.8333 6972.0833 t-test (парный) 0.0009 *** 1.9780 798.2043 0.9551 0.0000
Head_Mean_Intensity 12 71.3273 117.9902 46.6629 t-test (парный) 0.0019 ** -0.2792 137.9026 0.0116 0.7385
Head_DNA_% 12 34.3771 36.8463 2.4692 t-test (парный) 0.3003 ns 1.0457 0.8989 0.9557 0.0000
Tail_Length_px 12 24.1417 24.2500 0.1083 t-test (парный) 0.8281 ns 1.0306 -0.6293 0.9834 0.0000
Tail_Area_px 12 397.3333 489.0833 91.7500 t-test (парный) 0.0229
1.3082 -30.7233 0.9596 0.0000
Tail_Intensity 12 34370.0000 91626.5000 57256.5000 Wilcoxon (парный) 0.0025 ** 2.6877 -749.9035 0.9594 0.0000
Tail_Mean_Intensity 12 66.7238 139.9674 73.2435 t-test (парный) 0.0000 *** 2.1006 -0.1910 0.9302 0.0000
Tail_DNA_% 12 61.9714 63.1537 1.1824 t-test (парный) 0.4789 ns 1.0631 -2.7257 0.9802 0.0000
Tail_Moment 12 18.7794 19.5368 0.7574 t-test (парный) 0.2203 ns 1.0690 -0.5383 0.9893 0.0000

8 Информация о сессии

sessionInfo()
## R version 4.5.2 (2025-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Russian_Russia.utf8  LC_CTYPE=Russian_Russia.utf8   
## [3] LC_MONETARY=Russian_Russia.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Russian_Russia.utf8    
## 
## time zone: Europe/Moscow
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] scales_1.4.0     kableExtra_1.4.0 knitr_1.50       broom_1.0.9     
##  [5] ggpubr_0.6.1     ggplot2_4.0.2    rlang_1.1.7      purrr_1.2.1     
##  [9] tibble_3.3.0     tidyr_1.3.2      dplyr_1.2.0      readxl_1.4.5    
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.10        generics_0.1.4     xml2_1.4.0         rstatix_0.7.2     
##  [5] lattice_0.22-7     stringi_1.8.7      digest_0.6.37      magrittr_2.0.4    
##  [9] evaluate_1.0.5     grid_4.5.2         RColorBrewer_1.1-3 fastmap_1.2.0     
## [13] Matrix_1.7-4       cellranger_1.1.0   jsonlite_2.0.0     backports_1.5.0   
## [17] Formula_1.2-5      mgcv_1.9-3         viridisLite_0.4.2  textshaping_1.0.1 
## [21] jquerylib_0.1.4    abind_1.4-8        cli_3.6.5          splines_4.5.2     
## [25] withr_3.0.2        cachem_1.1.0       yaml_2.3.10        tools_4.5.2       
## [29] ggsignif_0.6.4     vctrs_0.7.1        R6_2.6.1           lifecycle_1.0.5   
## [33] stringr_1.5.1      car_3.1-3          pkgconfig_2.0.3    pillar_1.11.0     
## [37] bslib_0.9.0        gtable_0.3.6       glue_1.8.0         systemfonts_1.2.3 
## [41] xfun_0.52          tidyselect_1.2.1   rstudioapi_0.17.1  farver_2.1.2      
## [45] nlme_3.1-168       htmltools_0.5.8.1  labeling_0.4.3     rmarkdown_2.29    
## [49] carData_3.0-5      svglite_2.2.1      compiler_4.5.2     S7_0.2.1