Введение

Изучение закономерностей и особенностей роста рыб, в частности налима (Lota lota), несет большое научное и практическое значение. Оно тесно связано с оценкой состояния пресноводных экосистем и разработкой методов экологического прогнозирования. Оценка ростовых показателей промысловых рыб в отдельных водоемах, таких как бассейн Оби, где обитает одна из крупнейших в мире популяций налима, предполагает моделирование динамики численности и формирование представлений о пластичности популяции к условиям среды. Темп роста является основным механизмом адаптации вида и популяции в целом к условиям существования в водоеме, на который влияют состав и численность кормовых объектов, численность конкурентов и хищников, промысел и антропогенные факторы. Интерпретация этих факторов и оценка их действия на рост рыб является одной из главнейших задач в мониторинге ихтиофауны и окружающей среды. Возраст и рост характеризуют продолжительность жизни рыбы, условия ее существования, время наступления половой зрелости, что необходимо при изучении динамики численности, составлении прогнозов уловов, промысловой разведке и рациональном использовании запасов. Изучение динамики численности рыб невозможно без знания возраста, роста и возрастного состава их стад в различные периоды. При этом вычисление линейных размеров дает более стабильные результаты по сравнению с весом, а расчет обратной длины позволяет получить данные за весь период жизни особи.

Цели и задачи

Цель: определить и проанализировать зависимость темпов роста полупроходного налима (Lota lota Linnaeus, 1758) в бассейне Нижней Оби по регистрирующим структурам от условий водности и пола.

Задачи:

  1. Проанализировать возрастную структуру

  2. Исследовать влияние уровня и продолжительности затопления поймы на темпы роста.

Анализ возрастной структуры рыб (выборки 1996 и 2023 года)

# Данные 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")

Возрастная структура рыб выборки 1996 года

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)

Возрастная структура рыб выборки 2023 года

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.

Анализ связи размера годичных колец с гидрологическими показателями

Период 1987-1996

1. Связь средней величины годичных колец от длительности затопления

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)

Результаты анализа показали, что статистически значимые зависимости отсутствуют.

2. Связь медианной величины годичных колец от длительности затопления

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)

Результаты анализа показали, что статистически значимые зависимости отсутствуют.

3. Связь средней величины годичных колец от максимального уровня затопления

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)

Анализ показал, что есть статистически значимая зависимость.

4. Связь медианной величины годичных колец от максимального уровня затопления

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)

Анализ показал, что есть статистически значимая зависимость.

Период 2014-2023

5. Связь средней величины годичных колец от длительности затопления

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)

Результаты анализа показали, что статистически значимые зависимости отсутствуют.

6. Связь медианной величины годичных колец от длительности затопления

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)

Результаты анализа показали, что статистически значимые зависимости отсутствуют.

7. Связь средней величины годичных колец от максимального уровня затопления

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)

Анализ показал, что есть статистически значимая зависимость.

8. Связь медианной величины годичных колец от максимального уровня затопления

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         Да

Выводы

  1. Возраст налима, выловленного во время преднерестовой миграции осенью 1996 года, варьируется от 8 до 16. Самки в основном старше самцов. Доминирующие возрастные группы самок – десятилетние и двенадцатилетние, самцов – девятилетние. В 2023 году возрастной ряд меньше – от 5 до 10, особи более молодые. Наиболее многочисленная группа обоих полов – 8.

  2. Результаты кросс-корреляционного анализа показали, что статистически значимые зависимости средней арифметической и медианы ежегодных относительных приростов от длительности затопления поймы отсутствуют для обоих выборок. Была вявлена ститстическая зависимость между мдианой и средней арифметической ежегодных относительных приростов от максимального уровня затопления поймы.