Изучение закономерностей и особенностей роста рыб, в частности налима (Lota lota), несет большое научное и практическое значение. Оно тесно связано с оценкой состояния пресноводных экосистем и разработкой методов экологического прогнозирования. Оценка ростовых показателей промысловых рыб в отдельных водоемах, таких как бассейн Оби, где обитает одна из крупнейших в мире популяций налима, предполагает моделирование динамики численности и формирование представлений о пластичности популяции к условиям среды. Темп роста является основным механизмом адаптации вида и популяции в целом к условиям существования в водоеме, на который влияют состав и численность кормовых объектов, численность конкурентов и хищников, промысел и антропогенные факторы. Интерпретация этих факторов и оценка их действия на рост рыб является одной из главнейших задач в мониторинге ихтиофауны и окружающей среды. Возраст и рост характеризуют продолжительность жизни рыбы, условия ее существования, время наступления половой зрелости, что необходимо при изучении динамики численности, составлении прогнозов уловов, промысловой разведке и рациональном использовании запасов. Изучение динамики численности рыб невозможно без знания возраста, роста и возрастного состава их стад в различные периоды. При этом вычисление линейных размеров дает более стабильные результаты по сравнению с весом, а расчет обратной длины позволяет получить данные за весь период жизни особи.
Цель: определить и проанализировать зависимость темпов роста полупроходного налима (Lota lota Linnaeus, 1758) в бассейне Нижней Оби по регистрирующим структурам от условий водности и пола.
Задачи:
Проанализировать возрастную структуру
Исследовать влияние уровня и продолжительности затопления поймы на темпы роста.
# Данные 2023 года
age_2023 <- c(8, 9, 9, 9, 9, 8, 8, 5, 7, 6, 6, 8, 7, 10, 10, 7, 8, 8, 8, 8)
sex_2023 <- c("f", "f", "f", "f", "f", "m", "f", "m", "f", "m", "f", "f", "f", "f", "m", "f", "f", "m", "f", "m")
# Данные 1996 года
age_1996 <- c(12, 10, 12, 14, 11, 10, 14, 16, 13, 12, 10, 9, 12, 10, 11, 8, 9, 11, 9, 9, 10, 9, 11, 8, 9, 8, 10, 9, 9, 11, 9, 8)
sex_1996 <- c("f", "f", "f", "f", "f", "f", "f", "f", "f", "f", "f", "f", "f", "f", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m", "m")
# Создание датафреймов
df_1996 <- data.frame(Age = age_1996, Sex = sex_1996, Year = "1996")
df_2023 <- data.frame(Age = age_2023, Sex = sex_2023, Year = "2023")
p1 <- ggplot(df_1996, aes(x = factor(Age), fill = Sex)) +
geom_bar(position = position_dodge(preserve = "single"), width = 0.7) +
scale_fill_manual(
values = c("f" = "pink", "m" = "lightblue"),
labels = c("f" = "Самки", "m" = "Самцы"),
name = "Пол"
) +
labs(
title = "1996 год: Возрастная структура рыб",
x = "Возраст (лет)",
y = "Количество особей"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
legend.position = "top"
)
print(p1)
p2 <- ggplot(df_2023, aes(x = factor(Age), fill = Sex)) +
geom_bar(position = position_dodge(preserve = "single"), width = 0.7) +
scale_fill_manual(
values = c("f" = "pink", "m" = "lightblue"),
labels = c("f" = "Самки", "m" = "Самцы"),
name = "Пол"
) +
labs(
title = "2023 год: Возрастная структура рыб",
x = "Возраст (лет)",
y = "Количество особей"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10),
legend.position = "top"
)
print(p2)
# Статистика для 1996 года
stats_1996 <- df_1996 %>%
group_by(Sex) %>%
summarise(
Количество = n(),
Средний_возраст = round(mean(Age), 2),
Мин_возраст = min(Age),
Макс_возраст = max(Age),
.groups = 'drop'
) %>%
mutate(
Пол = ifelse(Sex == "f", "Самки", "Самцы"),
Год = "1996"
) %>%
select(Год, Пол, Количество, Средний_возраст, Мин_возраст, Макс_возраст)
# Статистика для 2023 года
stats_2023 <- df_2023 %>%
group_by(Sex) %>%
summarise(
Количество = n(),
Средний_возраст = round(mean(Age), 2),
Мин_возраст = min(Age),
Макс_возраст = max(Age),
.groups = 'drop'
) %>%
mutate(
Пол = ifelse(Sex == "f", "Самки", "Самцы"),
Год = "2023"
) %>%
select(Год, Пол, Количество, Средний_возраст, Мин_возраст, Макс_возраст)
# Объединяем статистику
age_stats <- bind_rows(stats_1996, stats_2023)
age_stats
## # A tibble: 4 × 6
## Год Пол Количество Средний_возраст Мин_возраст Макс_возраст
## <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 1996 Самки 14 11.8 9 16
## 2 1996 Самцы 18 9.33 8 11
## 3 2023 Самки 14 8.07 6 10
## 4 2023 Самцы 6 7.5 5 10
Возраст налима, выловленного во время преднерестовой миграции осенью 1996 года, варьируется от 8 до 16. Самки в основном старше самцов. Доминирующие возрастные группы самок – десятилетние и двенадцатилетние, самцов – девятилетние. В 2023 году возрастной ряд меньше – от 5 до 10, особи более молодые. Наиболее многочисленная группа обоих полов – 8.
s1 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "1987-1996",
range = "A2:B11"
)
colnames(s1) <- c("Mean", "Duration")
ggplot(s1, aes(x = Duration, y = Mean)) +
geom_point(size = 3, color = "steelblue") +
geom_smooth(method = "lm", se = FALSE, color = "darkred", size = 1) +
labs(
x = "Длительность затопления (дни)",
y = "Средний размер годичного кольца",
title = "1987-1996: Зависимость среднего размера кольца от длительности затопления"
) +
theme_minimal()
cor_result1 <- cor.test(s1$Duration, s1$Mean)
Результаты анализа показали, что статистически значимые зависимости отсутствуют.
s2 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "1987-1996",
range = "G2:H11"
)
colnames(s2) <- c("Median", "Duration")
ggplot(s2, aes(x = Duration, y = Median)) +
geom_point(size = 3, color = "forestgreen") +
geom_smooth(method = "lm", se = FALSE, color = "darkorange", size = 1) +
labs(
x = "Длительность затопления (дни)",
y = "Медианный размер годичного кольца",
title = "1987-1996: Зависимость медианного размера кольца от длительности затопления"
) +
theme_minimal()
cor_result2 <- cor.test(s2$Duration, s2$Median)
Результаты анализа показали, что статистически значимые зависимости отсутствуют.
s3 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "1987-1996",
range = "A2:D11"
)
s3 <- s3[, c(1, 4)]
colnames(s3) <- c("Mean", "MaxLevel")
ggplot(s3, aes(x = MaxLevel, y = Mean)) +
geom_point(size = 3, color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "darkgreen", size = 1) +
labs(
x = "Максимальный уровень затопления (см)",
y = "Средний размер годичного кольца",
title = "1987-1996: Зависимость среднего размера кольца от максимального уровня затопления"
) +
theme_minimal()
cor_result3 <- cor.test(s3$MaxLevel, s3$Mean)
Анализ показал, что есть статистически значимая зависимость.
s4 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "1987-1996",
range = "G2:J11"
)
s4 <- s4[, c(1, 4)]
colnames(s4) <- c("Median", "MaxLevel")
ggplot(s4, aes(x = MaxLevel, y = Median)) +
geom_point(size = 3, color = "darkorange") +
geom_smooth(method = "lm", se = FALSE, color = "navy", size = 1) +
labs(
x = "Максимальный уровень затопления (см)",
y = "Медианный размер годичного кольца",
title = "1987-1996: Зависимость медианного размера кольца от максимального уровня затопления"
) +
theme_minimal()
cor_result4 <- cor.test(s4$MaxLevel, s4$Median)
Анализ показал, что есть статистически значимая зависимость.
s5 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "2014-2023",
range = "A2:B10"
)
colnames(s5) <- c("Mean", "Duration")
ggplot(s5, aes(x = Duration, y = Mean)) +
geom_point(size = 3, color = "steelblue") +
geom_smooth(method = "lm", se = FALSE, color = "darkred", size = 1) +
labs(
x = "Длительность затопления (дни)",
y = "Средний размер годичного кольца",
title = "2014-2023: Зависимость среднего размера кольца от длительности затопления"
) +
theme_minimal()
cor_result5 <- cor.test(s5$Duration, s5$Mean)
Результаты анализа показали, что статистически значимые зависимости отсутствуют.
s6 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "2014-2023",
range = "G2:H10"
)
colnames(s6) <- c("Median", "Duration")
ggplot(s6, aes(x = Duration, y = Median)) +
geom_point(size = 3, color = "forestgreen") +
geom_smooth(method = "lm", se = FALSE, color = "darkorange", size = 1) +
labs(
x = "Длительность затопления (дни)",
y = "Медианный размер годичного кольца",
title = "2014-2023: Зависимость медианного размера кольца от длительности затопления"
) +
theme_minimal()
cor_result6 <- cor.test(s6$Duration, s6$Median)
Результаты анализа показали, что статистически значимые зависимости отсутствуют.
s7 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "2014-2023",
range = "A2:D10"
)
s7 <- s7[, c(1, 4)]
colnames(s7) <- c("Mean", "MaxLevel")
ggplot(s7, aes(x = MaxLevel, y = Mean)) +
geom_point(size = 3, color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "darkgreen", size = 1) +
labs(
x = "Максимальный уровень затопления (см)",
y = "Средний размер годичного кольца",
title = "2014-2023: Зависимость среднего размера кольца от максимального уровня затопления"
) +
theme_minimal()
cor_result7 <- cor.test(s7$MaxLevel, s7$Mean)
Анализ показал, что есть статистически значимая зависимость.
s8 <- readxl::read_excel(
"1996-2023.xlsx",
sheet = "2014-2023",
range = "G2:J10"
)
s8 <- s8[, c(1, 4)]
colnames(s8) <- c("Median", "MaxLevel")
ggplot(s8, aes(x = MaxLevel, y = Median)) +
geom_point(size = 3, color = "darkorange") +
geom_smooth(method = "lm", se = FALSE, color = "navy", size = 1) +
labs(
x = "Максимальный уровень затопления (см)",
y = "Медианный размер годичного кольца",
title = "2014-2023: Зависимость медианного размера кольца от максимального уровня затопления"
) +
theme_minimal()
cor_result8 <- cor.test(s8$MaxLevel, s8$Median)
Анализ показал, что есть статистически значимая зависимость.
# Создаем сводную таблицу
summary_cor <- data.frame(
Период = c(rep("1987-1996", 4), rep("2014-2023", 4)),
Зависимость = rep(c("Среднее-Длительность", "Медиана-Длительность",
"Среднее-Макс.уровень", "Медиана-Макс.уровень"), 2),
Корреляция = c(
round(cor_result1$estimate, 3),
round(cor_result2$estimate, 3),
round(cor_result3$estimate, 3),
round(cor_result4$estimate, 3),
round(cor_result5$estimate, 3),
round(cor_result6$estimate, 3),
round(cor_result7$estimate, 3),
round(cor_result8$estimate, 3)
),
p_value = c(
round(cor_result1$p.value, 4),
round(cor_result2$p.value, 4),
round(cor_result3$p.value, 4),
round(cor_result4$p.value, 4),
round(cor_result5$p.value, 4),
round(cor_result6$p.value, 4),
round(cor_result7$p.value, 4),
round(cor_result8$p.value, 4)
),
Значимость = c(
ifelse(cor_result1$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result2$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result3$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result4$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result5$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result6$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result7$p.value < 0.05, "Да", "Нет"),
ifelse(cor_result8$p.value < 0.05, "Да", "Нет")
)
)
summary_cor
## Период Зависимость Корреляция p_value Значимость
## 1 1987-1996 Среднее-Длительность 0.562 0.1155 Нет
## 2 1987-1996 Медиана-Длительность 0.430 0.2477 Нет
## 3 1987-1996 Среднее-Макс.уровень 1.000 0.0000 Да
## 4 1987-1996 Медиана-Макс.уровень 1.000 0.0000 Да
## 5 2014-2023 Среднее-Длительность 0.549 0.1590 Нет
## 6 2014-2023 Медиана-Длительность 0.481 0.2281 Нет
## 7 2014-2023 Среднее-Макс.уровень 1.000 0.0000 Да
## 8 2014-2023 Медиана-Макс.уровень 1.000 0.0000 Да
Возраст налима, выловленного во время преднерестовой миграции осенью 1996 года, варьируется от 8 до 16. Самки в основном старше самцов. Доминирующие возрастные группы самок – десятилетние и двенадцатилетние, самцов – девятилетние. В 2023 году возрастной ряд меньше – от 5 до 10, особи более молодые. Наиболее многочисленная группа обоих полов – 8.
Результаты кросс-корреляционного анализа показали, что статистически значимые зависимости средней арифметической и медианы ежегодных относительных приростов от длительности затопления поймы отсутствуют для обоих выборок. Была вявлена ститстическая зависимость между мдианой и средней арифметической ежегодных относительных приростов от максимального уровня затопления поймы.