# При отсутствии пакетов раскомментируйте установку
# 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))
Данные из листа 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)
Сводка по методам (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 |
Для каждого параметра проводим:
Итоговый выбор 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)
| 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 |
Для каждого параметра — 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))
}
Для каждого параметра оценивается линейная регрессия
auto = β0 + β1 · manual. На графике приводятся уравнение
регрессии и коэффициент детерминации R² (а также
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)
| 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)
}
}
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)
| 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 |
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