Polar Bear Habitat Dynamics in a Changing Arctic Environment

Author

Manon Gressard, Zoe Dardare, Ugo Rombach, Victorien Rodondi

Published

December 22, 2023

1 Executive summary

In the face of escalating climate change, the Arctic region is undergoing significant environmental upheaval, directly impacting the habitat of the polar bear, a species emblematic of this area. This project aims to explore the nuanced interaction between the habitat utilization of polar bears and the evolving conditions in the Arctic. Utilizing GPS data, we aim to map the current distribution of polar bears, establishing a baseline for understanding their habitat preferences and the ongoing research efforts dedicated to their study. Our analysis proceeds to examine the complex interplay between the dietary habits of polar bears and the amount of time they spend in open water. Preliminary results from statistical models suggest a significant impact of the melting season on the bears’ diet, indicating dietary shifts as sea ice recedes and they adapt to more aquatic hunting environments. Further, we delve into the dynamic relationship between sea ice coverage and polar bear movements over time. This aspect of our research aims to highlight the bears’ adaptation strategies and habitat preferences in response to sea ice fluctuations. Expanding our scope, we assess the broader effects of climate change on Arctic ecosystems, focusing on temperature fluctuations and ice melt patterns in key polar bear habitats, such as those in Alaska. This comprehensive examination seeks to elucidate the consequences of climate change on the availability and suitability of habitats for polar bears, providing a holistic view of the challenges they face.

2 Introduction

2.1 Overview and motivation

As the Arctic confronts rapid shifts in sea ice patterns and temperature due to climate change, critical habitats essential for polar bear survival are directly affected. Motivated by the urgent need to address the profound impact of climate change on Arctic ecosystems, this project is committed to a thorough understanding of polar bear habitat utilization, the correlation between their movements and changing sea ice conditions, and the broader consequences of these environmental changes. Our research combines rigorous data analysis with the immediacy of the climate crisis, aiming to contribute to wildlife conservation dialogue and support policies safeguarding the Arctic’s iconic species.

2.2 Research questions

  1. How has climate change impacted polar bear movement patterns and habitat utilization as depicted by GPS data?

  2. Can polar bear movement patterns be predicted using GPS data?

  3. Is there a link between the diet of polar bears and the number of days they spend in open water?

3 Data

3.1 Data Source

Our primary data for understanding bear demography and the interrelationship between ‘Ursus maritimus’ (polar bears) and ‘Pusa hispida’ (ringed seals) comes from the Living Planet Index (LPI), which focuses on population dynamics around the world. Despite the difficulties associated with the consistency of the data, this dataset is essential for the continuation of our research.

To track polar bear movements over time, we rely on a dataset collected by the US Geological Survey ([USGS])(https://www.usgs.gov/about/about-us/who-we-are). This data set provides detailed information on polar bear locations.

Data Description

Code
tibble(Variables= c("BearID_rsf", "DateTimeUTC_rsf", "latitude_rsf", "longitude_rsf", "season", "Many variables finally not used" ),
       Meaning = c("Unique ID per observation", " Date and time of the observation in Coordinated Universal Time (UTC)", "Latitude coordinate of the bear's location at the time of the observation", "Longitude coordinate of the bear's location at the time of the observation", "Time of year when the observation was made", "..."))%>%
  kable()%>%
          kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Variables Meaning
BearID_rsf Unique ID per observation
DateTimeUTC_rsf Date and time of the observation in Coordinated Universal Time (UTC)
latitude_rsf Latitude coordinate of the bear's location at the time of the observation
longitude_rsf Longitude coordinate of the bear's location at the time of the observation
season Time of year when the observation was made
Many variables finally not used ...

Temperature data covering the period from 1993 to 2023 on the Beaufort Sea coast is gathered from the PELLY ISLAND weather station, the most advanced station.

Data Description

Code
tibble(Variables= c("Date", "TAVG..Degrees.Fahrenheit.", "TMAX..Degrees.Fahrenheit.", "TMIN..Degrees.Fahrenheit.", "Many others variables finally not used" ),
       Meaning = c("Date", "Average temperature in degrees Fahrenheit", "Maximum temperature in degrees Fahrenheit", "Minimum temeperature in degrees Fahrenheit", "..."))%>%
  kable()%>%
          kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Variables Meaning
Date Date
TAVG..Degrees.Fahrenheit. Average temperature in degrees Fahrenheit
TMAX..Degrees.Fahrenheit. Maximum temperature in degrees Fahrenheit
TMIN..Degrees.Fahrenheit. Minimum temeperature in degrees Fahrenheit
Many others variables finally not used ...

Sea ice coverage data, offering a detailed graphical representation of ice extent and relying on precise visible imagery data, is sourced from the MASIE-NH (Multisensor Analyzed Sea Ice Extent – Northern Hemisphere).

Data Description

Code
tibble(Variables = c("yyyyddd", "Beaufort_Sea" , "Many others variables finally not used" ),
       Meaning= c ("Date of the observation", "Daily 4km sea ice component in the region of Beaufort Sea", "..."))%>%
  kable()%>%
          kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Variables Meaning
yyyyddd Date of the observation
Beaufort_Sea Daily 4km sea ice component in the region of Beaufort Sea
Many others variables finally not used ...

Additional data from Aerial Master, covering the locations of polar bears in Alaska from 1979 to 2011 and from 2015 to 2017, will be merged for comprehensive analysis.

Data Description

Code
tibble(Variables = c("ID", "GMT_Minus8_DateTime", "ArcLat", "Arclong", "Many others variables finally not used"), 
       Meaning = c("Unique ID per observation", "Date and time of the observation", "Latitude", "Longitude", "...")) %>%
    kable("html") %>%  
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Variables Meaning
ID Unique ID per observation
GMT_Minus8_DateTime Date and time of the observation
ArcLat Latitude
Arclong Longitude
Many others variables finally not used ...

Lastly, insights into the diets of polar bears in the Beaufort Sea, crucial for exploring dietary trends and their ecological implications, are provided by a dataset from USGS.

Data Description

Code
tibble(Variables = c("BearID","Year","Capture.date",
                     "Ageclass", "Sex", "OW_50pcrt","Meltseason","Bearded_seal",
                     "Ringed_seal","Beluga_whale","Bowhead_whale","Seabird_nestling"), 
       Meaning = c("Unique observation per bear","Year of the capture",
                   "Date of the capture", "The stage of maturity of the polar bear",
                   "The sex of the polar bear", "Number of days covered in open water",
                   "Number of days of the meltseason in the corresponding year",
                   "Percentage of bearded seal eaten in the corresponding period",
                   "Percentage of ringed seal eaten in the corresponding period",
                   "Percentage of beluga whale eaten in the corresponding period",
                   "Percentage of bowhead sealed eaten in the corresponding period",
                   "Percentage of seabird nestling eaten in the corresponding period"))%>%
  kable()%>%
          kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) 
Variables Meaning
BearID Unique observation per bear
Year Year of the capture
Capture.date Date of the capture
Ageclass The stage of maturity of the polar bear
Sex The sex of the polar bear
OW_50pcrt Number of days covered in open water
Meltseason Number of days of the meltseason in the corresponding year
Bearded_seal Percentage of bearded seal eaten in the corresponding period
Ringed_seal Percentage of ringed seal eaten in the corresponding period
Beluga_whale Percentage of beluga whale eaten in the corresponding period
Bowhead_whale Percentage of bowhead sealed eaten in the corresponding period
Seabird_nestling Percentage of seabird nestling eaten in the corresponding period

3.2 Data Cleanup

At this stage, we are taking care of our different data sets, and are oragnising them into several tables that will help us to answer our research questions individually.

3.2.1 Living Planet Database

We start by defining the year columns and convert them to numeric, then we calculate the annual sum for each species. We then calculate a 5-year cumulative sum for each species, and prepare the data for plotting. We also calculate the moving average for the plot data. Then we convert all columns with names starting with ‘X’ followed by 4 digits to numeric, and replace non-numeric values in these columns with NA. We calculate the sum of values in columns starting with ‘X’, select only relevant columns for mapping, and plot the global distribution of polar bears.

Code
year_columns <- paste0("X", 1970:2020)
ursus_data <- apply(data1[data1$Binomial == "Ursus maritimus", year_columns], 2, as.numeric)
pusa_data <- apply(data2[data2$Binomial == "Pusa hispida", year_columns], 2, as.numeric)

ursus_annual_sum <- colSums(ursus_data, na.rm = TRUE)
pusa_annual_sum <- colSums(pusa_data, na.rm = TRUE)

# Function to calculate the cumulative sum over 5-year periods
calculate_5yr_cumulative_sum <- function(annual_sum) {
  cum_sum_5yr <- numeric(length(annual_sum))
  for (i in 1:length(annual_sum)) {
    start_index <- max(1, i - 4)
    cum_sum_5yr[i] <- sum(annual_sum[start_index:i])
  }
  return(cum_sum_5yr)
}

ursus_cum_sum_5yr <- calculate_5yr_cumulative_sum(ursus_annual_sum)
pusa_cum_sum_5yr <- calculate_5yr_cumulative_sum(pusa_annual_sum)

years <- 1970:2020
ursus_plot_data <- data.frame(Year = years, Cumulative_Sum_5yr = ursus_cum_sum_5yr)
pusa_plot_data <- data.frame(Year = years, Cumulative_Sum_5yr = pusa_cum_sum_5yr)

ursus_plot_data$Moving_Avg <- rollmean(ursus_plot_data$Cumulative_Sum_5yr, 10, fill = NA, align = "right")
pusa_plot_data$Moving_Avg <- rollmean(pusa_plot_data$Cumulative_Sum_5yr, 10, fill = NA, align = "right")

polar_bears<- data1
x_cols <- grep("^X\\d{4}$", names(polar_bears))
polar_bears[, x_cols] <- lapply(polar_bears[, x_cols], function(x) {
  suppressWarnings(as.numeric(as.character(x)))
})
polar_bears[, x_cols][!sapply(polar_bears[, x_cols], is.numeric)] <- NA
polar_bears$Totalpolarbears <- rowSums(polar_bears[, x_cols], na.rm = TRUE)

polar_bears[, x_cols][!sapply(polar_bears[, x_cols], is.numeric)] <- NA

polar_bears$Totalpolarbears <- rowSums(polar_bears[, x_cols], na.rm = TRUE)

polar_bears_map <- polar_bears[, c("Latitude", "Longitude", "Totalpolarbears")]

min_lat <- 60
max_lat <- 90
min_lon <- -180
max_lon <- 180

polar_bears_filtered <- filter(polar_bears, Latitude >= min_lat & Latitude <= max_lat & 
                                 Longitude >= min_lon & Longitude <= max_lon)

polar_bears_filtered2 <- polar_bears_filtered %>%
  mutate(MarkerColor = ifelse(Totalpolarbears >= 10000, "blue", "red"))

scale_factor <- 0.005

3.2.2 Aerial Master Database

Here’s how we’re going to proceed for our Aerial Master (AM) table. We start to calculate the number of missing values for each column in the AM data set, then we identify the columns with more than 200,000 missing values, and decide to remove them from the data set. For better clarity, we rename the columns in the data set. Then we calculate the proportion of missing values for each column in the AM data set, and create a data frame with column names and proportions of missing values, by sorting the data frame by the proportion of missing values in descending order.

Code
na_count <- colSums(is.na(AM))

na_cols <- which(na_count > 200000)

AM <- AM[, -na_cols]
AM <- as_tibble(AM)

AM <- AM %>% rename(date_time_hour = GMT_Minus8_DateTime)
AM <- AM %>% rename(Longitude = ArcLong)
AM <- AM %>% rename(Latitude = ArcLat)

part_nulles <- colMeans(is.na(AM))

df <- data.frame(colonne = names(AM), part_nulles = part_nulles)

df <- df %>%
  mutate(colonne = factor(colonne, levels = names(AM)[order(part_nulles)]))

We create a bar chart to visualize the proportion of missing values for each column:

Code
gg1 <- ggplot(df, aes(x = colonne, y = part_nulles, text = paste("Column:", colonne, "<br>:Share of zero values:", scales::percent(round(part_nulles, 2))))) +
  geom_bar(stat = "identity", fill = "steelblue", width = 0.8)  +
  labs(title = "As we can see, many columns have quite a lot of missing data ",
       x = "Columns",
       y = "Share of zero values per column") +
  scale_y_continuous(labels = percent_format()) +
  coord_flip() +
  geom_text(aes(label = scales::percent(round(part_nulles, 2))), hjust = -0.1, vjust = 0.5, size = 1.8) +
  theme(axis.text.y = element_text(size = 4))
ggplotly(gg1, tooltip = "text")

Due to the significant amount of missing data, only location data is retained. Other columns are binary variables representing parameters of little interest or with too many missing values. We then calculate the proportion of missing values for each column in the final data set, and we remove rows with missing values from it. Then we separate the “Datetime” column into individual components (month, day, year, hour, minute, second, period), and select relevant columns for further analysis.

Code
AM_fin <- select(AM, ID, date_time_hour, Latitude, Longitude)

part_nulles2 <- colMeans(is.na(AM_fin))

AM_fin <- drop_na(AM_fin)

names(AM_fin)[names(AM_fin) == "date_time_hour"] <- "Datetime"

AM_fin <- AM_fin |> separate(Datetime, into = 
                               c("month","day","year", "hour", "minute", "second", "period"))

AM_fin <- select(AM_fin, ID, day, month, year, Latitude, Longitude)

AM_fin <- drop_na(AM_fin)

AM_fin$day <- as.integer(AM_fin$day)
AM_fin$month <- as.integer(AM_fin$month)
AM_fin$year <- as.integer(AM_fin$year)

We create a bar chart to visualize the number of observations per year:

Code

fig_79_11 <- plot_ly(x = AM_fin$year, histfunc = 'sum', type = "histogram")
fig_79_11 <- fig_79_11 %>% layout(
    yaxis = list(type = 'linear'), 
    title = "Many observations in 2009-2011",
    bargap = 0.2  
)

fig_79_11

Let’s do the same operations for the second data set “Aerial Master 2015-2017”. We repeat the same operations than on the first one to clean it up.

Code
na_count2 <- colSums(is.na(AM2))

na_cols2 <- which(na_count2 > 200000)

AM2 <- AM2 %>% rename(date_time_hour = GMT_Minus8_DateTime)
AM2 <- AM2 %>% rename(Longitude = ArcLong)
AM2 <- AM2 %>% rename(Latitude = ArcLat)

AM2 <- AM2[, -na_cols2]
AM2 <- as_tibble(AM2)

part_nulles2 <- colMeans(is.na(AM2))

AM_fin2 <- select(AM2, ID, date_time_hour, Latitude, Longitude)

part_nulles2 <- colMeans(is.na(AM_fin2))

AM_fin2 <- drop_na(AM_fin2)

names(AM_fin2)[names(AM_fin2) == "date_time_hour"] <- "Datetime"

AM_fin2 <- AM_fin2 |> separate(Datetime, into = 
                                 c("month","day","year", "hour", "minute", "second", "period"))

AM_fin2 <- select(AM_fin2, ID, day, month, year, Latitude, Longitude)

AM_fin2 <- drop_na(AM_fin2)

AM_fin2$day <- as.integer(AM_fin2$day)
AM_fin2$month <- as.integer(AM_fin2$month)
AM_fin2$year <- as.integer(AM_fin2$year)

Again, we create a bar chart to visualize the number of observations per year.

Code
AM_fin2_ <- AM_fin2 %>%
  group_by(year) %>%
  summarise(count = n()) %>%
  ungroup()

AM_fin2_$tooltip <- paste("Year:", AM_fin2_$year, "<br>Number of Observations:", AM_fin2_$count)

p <- ggplot(data = AM_fin2_, aes(x = year, y = count)) + 
  geom_bar(stat = "identity", aes(text = tooltip), fill = "steelblue") +  
  labs(title = "Number of observations per year", x = "Year", y = "") +
  theme_minimal()

ggplotly(p, tooltip = "text")

We combine the filtered data from the two final data sets into a single data frame.

Code
df_merged <- rbind(AM_fin, AM_fin2)
df_merged <- df_merged[df_merged$Latitude != 0 & df_merged$Longitude != 0,]

# Utilisation de file.path() pour construire le chemin
iconPath <- file.path("photo", "polarBear.png")

# Création de l'icône avec le chemin compatible multiplateforme
icon <- makeIcon(iconUrl = iconPath, iconWidth = 35, iconHeight = 35)

For the third data set about the diets of polar bears in Beaufort, there is fast no data cleaning.

Code
na_count_pb <- colSums(is.na(pb))
kable(na_count_pb) %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
x
BearID 0
Year 0
Capture date 0
Ageclass 0
Sex 0
OW_50prct 0
OW_15prct 0
Meltseason 0
Bearded_seal 0
Ringed_seal 0
Beluga_whale 0
Bowhead_whale 0
Seabird_nestling 0

Since there are no missing values, the data set is considered “perfectly clean”. We only rename specific columns for better clarity.

Code
pb <- pb %>% rename(days_in_cov_water = OW_50prct)
pb <- pb %>% rename(Perc_bearded_eaten = Bearded_seal)
pb <- pb %>% rename(Perc_ringed_eaten = Ringed_seal)
pb <- pb %>% rename(Perc_beluga_eaten = Beluga_whale)
pb <- pb %>% rename(Perc_bowhead_eaten = Bowhead_whale)
pb <- pb %>% rename(Perc_seabird_eaten = Seabird_nestling)

3.2.3 Polar Bear Distribution Database

We began by extracting the essential information, such as each bear’s identifier, date and geographical coordinates. This data was then converted into standardised formats to ensure the consistency and accuracy of the analysis. A crucial aspect of our processing was data cleaning, where we eliminated incomplete records to ensure the reliability of our study. After organising the data by bear identifier and date, we calculated the distance traveled between successive bear points using Haversine’s formula. As a result, the first GPS broadcast for each bear does not have a value in the distance column calculated in this way. This method provides us with valuable insights into the movement patterns of bears. This approach created a coherent and detailed data set, essential for our behavioural analysis of bear movements in their natural habitat.

Code
ours_nettoyé <- ours_de_base %>%
  select(bearid = BearID_rsf, date = DateTimeUTC_rsf, latitude = latitude_rsf, longitude = longitude_rsf)

ours_nettoyé$date <- as.POSIXct(ours_nettoyé$date, format = "%m/%d/%Y %H:%M", tz = "UTC")

ours_clean <- ours_nettoyé %>%
  filter(!is.na(bearid) & !is.na(date) & !is.na(latitude) & !is.na(longitude))

ours_clean$date <- as.Date(ours_clean$date)

ours_clean <- ours_clean %>%
  arrange(bearid, date)

ours_clean <- ours_clean %>%
  group_by(bearid) %>%
  mutate(
    Longitude_prev = lag(longitude),
    Latitude_prev = lag(latitude)
  ) %>%
  rowwise() %>%
  mutate(
    Distance = ifelse(
      is.na(Longitude_prev) | is.na(Latitude_prev), 
      NA, 
      distHaversine(
        c(longitude, latitude), 
        c(Longitude_prev, Latitude_prev)
      )
    )
  ) %>%
  ungroup()
Code
nb_obs <- read_csv(here::here("Report/données/ours_clean.csv"))
# Convertir la date en format Date et extraire l'année
nb_obs$date <- as.Date(nb_obs$date)
nb_obs$year <- format(nb_obs$date, "%Y")

# Calculer le nombre d'observations par année
observations_par_an <- nb_obs %>%
  group_by(year) %>%
  summarise(NumberPointGPS = n())

# Créer un graphique
graph_nb_obs <- ggplot(observations_par_an, aes(x = year, y = NumberPointGPS, fill = NumberPointGPS)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  scale_fill_gradient(low = "blue", high = "red") +
  labs(title = "Number of polar bear GPS relvets by year",
       x = "Year",
       y = "Number of GPS points") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) # Rotation des étiquettes

# Convertir en graphique interactif
graph_nb_obs_interactif <- ggplotly(graph_nb_obs, tooltip = c("x", "y"))

# Afficher le graphique
graph_nb_obs_interactif

3.2.4 Temperatures Data Base

In order to clean this data set, we converted the temperatures from Fahrenheit to Celsius, an international standard that makes them easier to understand and compare. The next step was to merge the maximum and minimum temperature data based on date to get a consistent overview. Finally, we calculated the daily average temperature, which provides a more balanced and meaningful perspective of weather conditions. To simplify and clarify our results, we chose to keep only the mean temperature data, eliminating the maximum and minimum temperature columns. This process provided an accurate and easily interpretable overview of climate trends on Pelly Island.

Code
convert_to_celsius <- function(fahrenheit) {
  (fahrenheit - 32) * 5 / 9
}

max_clean <- max_temp %>%
  select(Date, TMAX = `TMAX..Degrees.Fahrenheit.`) %>%
  mutate(Date = as.Date(Date), TMAX = convert_to_celsius(TMAX))

min_clean <- min_temp %>%
  select(Date, TMIN = `TMIN..Degrees.Fahrenheit.`) %>%
  mutate(Date = as.Date(Date), TMIN = convert_to_celsius(TMIN))

df_merged2 <- inner_join(max_clean, min_clean, by = "Date")

temp_beaufort <- df_merged2 %>%
  mutate(Average_Temperature = (TMAX + TMIN) / 2)

temp_beaufort <- temp_beaufort %>%
  select(-TMAX, -TMIN)

3.2.5 Sea Ice Cover Data Base

To refine our analysis of the Beaufort Sea, we first filtered the data, discarding information relating to other maritime regions. Next, we converted the date format from ‘yyyyyddd’ to a standard format, facilitating temporal analyses. These data preparations are crucial to ensuring the accuracy and relevance of our future analyses.

Code
glace_beaufort$
glace_beaufort <- glace_beaufort %>%
  select(-Chukchi_Sea,                    -East_Siberian_Sea  ,             -Laptev_Sea      ,               
          -Kara_Sea    ,                    -Barents_Sea      ,               -Greenland_Sea  ,                
          -Baffin_Bay_Gulf_of_St._Lawrence ,-Canadian_Archipelago ,           -Hudson_Bay   ,                  
          -Central_Arctic       ,           -Bering_Sea  ,                   -Baltic_Sea ,                    
          -Sea_of_Okhotsk   ,               -Yellow_Sea  ,                   -Cook_Inlet, -Northern_Hemisphere)

glace_beaufort$yyyyddd <- as.character(glace_beaufort$yyyyddd)

# Convertir la colonne yyyyddd en dates
glace_beaufort$yyyyddd <- as.Date(as.numeric(substr(glace_beaufort$yyyyddd, 5, 7)) - 1, 
                               origin = as.Date(paste0(substr(glace_beaufort$yyyyddd, 1, 4), "-01-01")))

glace_beaufort$yyyyddd <- ymd(glace_beaufort$yyyyddd)

3.2.6 Combined Data Sets

From this data set, we assigned the nearest mean temperature date to each polar bear GPS point. In order to do this, we scanned each polar bear observation, calculated the difference in days between that observation and the dates of the temperature readings, and selected the temperature corresponding to the closest date. This process made it possible to precisely link the climatic conditions to the specific positions of the bears.

Code
ours_clean$Closest_Avg_Temperature <- numeric(nrow(ours_clean))

for (i in 1:nrow(ours_clean)) {
    # Calculate the difference in days
  differences <- abs(difftime(temp_beaufort$Date, ours_clean$date[i], units = "days"))
  
    # Find the minimum difference index
  closest_idx <- which.min(differences)
  
    # Assign the nearest average temperature
  ours_clean$Closest_Avg_Temperature[i] <- temp_beaufort$Average_Temperature[closest_idx]
}


ours_clean <- arrange(ours_clean, bearid)

ours_clean <- ours_clean %>%
  arrange(bearid, date)

bear_periods <- ours_clean %>%
  group_by(bearid) %>%
  summarise(start_date = min(date), end_date = max(date))

count_active_bears <- function(date, periods) {
  sum(periods$start_date <= date & periods$end_date >= date)
}

unique_dates <- unique(ours_clean$date)
count_bears_per_date <- sapply(unique_dates, function(date) count_active_bears(date, bear_periods))

count_bears_df <- data.frame(date = unique_dates, Count_Bears = count_bears_per_date)

ours_clean <- merge(ours_clean, count_bears_df, by = "date")

3.2.7 Data Set Regression for Travel Forecasts

We load the data set we have been working on in the Analysis section. We will need it to be able to predict bear movement in the future.

  • We use a methodical approach to develop and evaluate predictive models of latitude and longitude. We began by dividing our selected data set into two distinct sets: one for training and one for testing, ensuring reproducibility through a fixed seed parameter. This division ensured that models would be trained on a subset of the data and tested on a separate set, not used during training, for an unbiased assessment of their performance.

  • We then trained two separate models using the random forest algorithm, one to predict latitude and the other for longitude, excluding longitude and latitude respectively from the predictor variables to avoid redundancy. After training, we used the models to predict latitude and longitude values on the test set.

  • The performance of the models was evaluated by calculating the root mean square error (RMSE) for the latitude and longitude predictions. The results showed an RMSE of 1.2227 for latitude and 13.4141 for longitude. By quantifying the mean difference between predicted and actual values, these RMSE measurements revealed that the latitude model was relatively accurate, while the longitude model had a greater margin of error.

  • We extend our study to include predictions over the next five years. Using the latest date in our data set as a starting point, we have generated a sequence of future dates. To these dates, we used a function to associate the relevant mean temperature and ice extent data for the Beaufort Sea, taking care to fill in any gaps with the median of the available temperatures, to maintain data consistency.

  • We then enriched the future data by assigning bear identifiers (BearIDs) to each GPS point, simulating the tracking of 20 different bears. This step allowed us to contextualize our predictions within a more realistic framework, reflecting the potential diversity of bear movements in the future.

  • Using the random forest models, we had previously trained, we predicted the geographical positions (latitude and longitude) for each combination of BearID and future date. These predictions, based on anticipated environmental conditions, were compiled into a new dataset, providing a prospective view of possible polar bear movements in the face of future climate and environmental change. This work represents a significant advance in our understanding of polar bear dynamics and their potential adaptation to changes in their habitat.

Code

data$date <- as.Date(data$date)
data$year <- year(data$date)
data$month <- month(data$date)
data$day <- day(data$date)

data_selected <- data %>%
  select(latitude, longitude, year, month, day, Closest_Avg_Temperature, Beaufort_Sea, date)

data_selected <- na.omit(data_selected)


# Division des données en ensemble d'entraînement et de test
set.seed(123) # Pour la reproductibilité
indices <- sample(1:nrow(data_selected), size = 0.8 * nrow(data_selected))
train_data <- data_selected[indices, ]
test_data <- data_selected[-indices, ]

# Entraînement du modèle pour la latitude
model_latitude <- randomForest(latitude ~ ., data = train_data[, -2]) 

# Entraînement du modèle pour la longitude
model_longitude <- randomForest(longitude ~ ., data = train_data[, -1]) 

predictions_latitude <- predict(model_latitude, test_data)
predictions_longitude <- predict(model_longitude, test_data)

rmse_latitude <- sqrt(mean((predictions_latitude - test_data$latitude)^2))
rmse_longitude <- sqrt(mean((predictions_longitude - test_data$longitude)^2))

print(paste("RMSE Latitude:", rmse_latitude))
#> [1] "RMSE Latitude: 1.2227392145361"
print(paste("RMSE Longitude:", rmse_longitude))
#> [1] "RMSE Longitude: 13.4141324335172"

last_date <- max(data_selected$date)
future_dates <- seq(from = last_date + 1, by = "day", length.out = 5 * 365)

future_data <- data.frame(
  date = future_dates,
  Closest_Avg_Temperature = temp_beaufort$Average_Temperature[match(future_dates, temp_beaufort$date)],
  Beaufort_Sea = glace_beaufort$Beaufort_Sea[match(future_dates, glace_beaufort$date)],
  year = year(future_dates),
  month = month(future_dates),
  day = day(future_dates)
)

nombre_ours <- 20
bear_id_start <- 301
total_days <- length(future_dates)

future_data$BearID <- rep(bear_id_start:(bear_id_start + nombre_ours - 1), 
                          times = ceiling(total_days / nombre_ours))[1:total_days]


predicted_latitude <- predict(model_latitude, future_data)
predicted_longitude <- predict(model_longitude, future_data)

predictions <- data.frame(BearID = future_data$BearID, date = future_dates, latitude = predicted_latitude, longitude = predicted_longitude)

predictions <- na.omit(predictions)

4 Exploratory Data Analysis

The two following graphs show cumulative trends over 5 years for two distinct species: the ringed seal (Pusa hispida) and the polar bear (Ursus maritimus), respectively. The first trend, represented by a green line, shows the cumulative sum over 5 years of seal counts. This shows how the total number of seals and bears observed has evolved over a rolling 5-year period. The second trend, a dotted red line, represents a moving average. This average smoothes out annual variations to give a better idea of the general trend over the long term. It is important to note that our data set no longer contains data from 2010 onwards, which explains the decline.

Code
p1 <- ggplot(pusa_plot_data, aes(x = Year, y = Cumulative_Sum_5yr)) +
  geom_line(color = "green") +
  geom_line(aes(y = Moving_Avg), color = "red", linetype = "dashed") +
  ggtitle("5-Year Cumulative Count Trend for Ringed Seals (Pusa hispida)") +
  xlab("Years") +
  ylab("Cumulative Count Trend")

p2 <- ggplot(ursus_plot_data, aes(x = Year, y = Cumulative_Sum_5yr)) +
  geom_line(color = "blue") +
  geom_line(aes(y = Moving_Avg), color = "red", linetype = "dashed") +
  ggtitle("5-Year Cumulative Count Trend for Polar Bears (Ursus maritimus)") +
  xlab("Years") +
  ylab("Cumulative Count Trend")

grid.arrange(p1, p2, ncol = 2)

Focus on Alaska

In light of recent data, predominantly sourced from the American continent, there is growing concern over the declining population of Polar Bears (Ursus maritimus). This trend warrants a closer examination of the origins of our data. To gain a clearer understanding of these patterns, we will delve into the geographic source of this information. Such an approach is crucial, as it allows us to pinpoint specific regions contributing most significantly to the data set.

On the following map, we identify the locations from which the majority of our polar bear sightings are reported. Given the essential nature of these data for understanding the state of polar bear populations, identifying the main source regions is a step that helped us greatly in subsequently guaranteeing the robustness of our results.

Code
leaflet_map <- leaflet(polar_bears_filtered2) %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addCircleMarkers(
    lng = ~Longitude, lat = ~Latitude, 
    popup = ~paste("Country: ", Country, "<br>",
                   "Total Observations: ", Totalpolarbears),
    color = ~MarkerColor, 
    radius = ~Totalpolarbears * scale_factor, 
    clusterOptions = markerClusterOptions(),
    fillOpacity = 0.5
  ) %>%
  addMiniMap() %>% 
  setView(lng = mean(c(min_lon, max_lon)), lat = mean(c(min_lat, max_lat)), zoom = 4) %>%
  addProviderTiles(providers$Esri.WorldImagery) %>% 
  addScaleBar() %>% 
  addLayersControl(
    baseGroups = c("OpenStreetMap", "Satellite"),
    options = layersControlOptions(collapsed = FALSE)
  )

leaflet_map

From this graph, we will identify the locations from which the majority of our polar bear sightings are reported. Given the essential nature of these data for understanding the state of polar bear populations, identifying the main source regions is a step that helped us greatly in subsequently guaranteeing the robustness of our results.

In order to address our research questions, we decided to focus on Alaska, as it is the region that provides the best amount of data.

4.1 How has climate change impacted polar bear movement patterns and habitat utilization as depicted by GPS data?

In this initial phase, we have gathered the essential data to analyze the movement of polar bears and the impacts of climate change. We selected temperature readings from various meteorological stations in the Beaufort Sea as our primary indicator. Additionally, we have investigated the trends in ice cover and its temporal fluctuations. The process of processing, merging, and analyzing disparate data sets presents a significant challenge. Currently, our statistical analysis primarily considers temperature changes as the key factor in explaining the migration patterns of polar bears.

Code
couleurs_saisons <- c("Spring" = "#89A45E", "Summer" = "#7FC6BC", "Autumn" = "#D17A22", "Winter" = "#5A7D9A")

# Déterminer les années uniques dans les données
unique_years <- unique(year(ymd(temp_beaufort_graph$date)))

# Fonction pour générer un graphique par saison et année
generate_plot <- function(season, year) {
  data_filtered <- temp_beaufort_graph %>%
    filter(season == season, year(ymd(date)) == year) %>%
    mutate(Average_Temperature = round(Average_Temperature * 2) / 2)

  couleur_ligne <- couleurs_saisons[season]

  ggplot(data_filtered, aes(x = date, y = Average_Temperature, group = season)) +
    geom_line(color = couleur_ligne, alpha = 0.7) +
    geom_point(color = couleur_ligne, size = 1, alpha = 0.7) +
    theme_minimal() +
    labs(title = paste("Temperature in the Beaufort Sea: ", season, " ", year),
         x = "Date",
         y = "Temperature (°C)")
}

# Générer et sauvegarder les graphiques en tant que fichiers HTML pour chaque combinaison saison-année
for (season in names(couleurs_saisons)) {
  for (year in unique_years) {
    plotly_plot <- ggplotly(generate_plot(season, year))
    html_file <- paste0("plot_", season, "_", year, ".html")
    htmlwidgets::saveWidget(plotly_plot, file = html_file)
  }
}

Here you can see data on the location of polar bears in 1979. The interest is not in the number of data, as we have seen from the graph of the number of sightings that these data are inconsistent and tend to increase as the years go by. The interest lies rather in the general location of all these data. So here we see that polar bears tended to live in northern Alaska in 1979.

Year 1979:

Code
# Cards for analysis
# Filtrer les données pour l'année 1979

df_1979 <- df_merged %>% filter(year == 1979)

# Créer une carte
map_1979 <- leaflet()

# Ajouter une basemap OpenStreetMap
map_1979 <- map_1979 %>% addTiles(
  urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  attribution = "Map data &copy; <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> contributors, <a href='https://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>"
)
# Ajouter les points de données
map_1979 <- leaflet(quakes) %>% addTiles() %>%
  addMarkers(data = df_1979,lat = df_1979$Latitude, lng = df_1979$Longitude,
             clusterOptions = markerClusterOptions(),
             icon = icon)

# Afficher la carte
map_1979

The locations of polar bears in 1990 are shown here. Compared with 1979, we can observe a westward shift in the average location of the bears. However, they still remain in northern Alaska.

Year 1990:

Code
# Filtrer les données pour l'année 1990
df_1990 <- df_merged %>% filter(year == 1990)

# Créer une carte
map_1990 <- leaflet()

# Ajouter une basemap OpenStreetMap
map_1990 <- map_1990 %>% addTiles(
  urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  attribution = "Map data &copy; <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> contributors, <a href='https://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>"
)
# Ajouter les points de données
map_1990 <- leaflet(quakes) %>% addTiles() %>%
  addMarkers(data = df_1990,lat = df_1990$Latitude, lng = df_1990$Longitude,
             clusterOptions = markerClusterOptions(),
             icon = icon)

# Afficher la carte
map_1990

Data for 2015 are shown here. Compared with 1990, there has been a clear westward shift in location data. Some bears remain in the north, but it is interesting to note that some bears also live in the far west of Alaska, but no longer in the north.

Year 2015:

Code
# Filtrer les données pour l'année 2015
df_2015 <- df_merged %>% filter(year == 2015)

# Créer une carte
map_2015 <- leaflet()

# Ajouter une basemap OpenStreetMap
map_2015 <- map_2015 %>% addTiles(
  urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
  attribution = "Map data &copy; <a href='https://www.openstreetmap.org/'>OpenStreetMap</a> contributors, <a href='https://creativecommons.org/licenses/by-sa/2.0/'>CC-BY-SA</a>"
)
# Ajouter les points de données
map_2015 <- leaflet(quakes) %>% addTiles() %>%
  addMarkers(data = df_2015,lat = df_2015$Latitude, lng = df_2015$Longitude,
             clusterOptions = markerClusterOptions(),
             icon = icon)

# Afficher la carte
map_2015

Code Visualization

To represent the movements of polar bears within our data set, we needed to generate a trend for the average distance these mammals travel each day. We calculated the total distance traveled by each bear per day and per year. Next, we determined the daily average of this distance for each bear per year. Finally, we calculated the overall average of these daily averages for all the bears, year by year, in order to identify a general trend in the distances traveled by polar bears over time. These results are shown in the following interactive graph, and you can select a specific year by double-clicking on it. As explained in the graph (graph number on the number of GPS points per year) we have a wide disparity in our data depending on the year. Despite this, a trend in the daily distance traveled by polar bears can be seen in the graph. There has been a downward trend in this distance over the last 15 years.

Code
plot_distance <- ours_clean

# Convertir la colonne date en type date et extraire l'année
plot_distance$date <- as.Date(plot_distance$date)
plot_distance$year <- year(plot_distance$date)

# Calculer la distance totale parcourue par jour pour chaque ours dans chaque année
distance_journaliere_par_annee <- plot_distance %>%
  group_by(bearid, date, year) %>%
  summarize(distance_totale = sum(Distance, na.rm = TRUE))

# Calculer la moyenne quotidienne pour chaque ours par année
moyenne_quotidienne_par_ours_par_annee <- distance_journaliere_par_annee %>%
  group_by(bearid, year) %>%
  summarize(
    jours_uniques = n(),
    distance_annuelle = sum(distance_totale, na.rm = TRUE),
    moyenne_quotidienne = distance_annuelle / jours_uniques
  )

# Calculer la moyenne globale quotidienne pour chaque année sur tous les ours
moyenne_globale_quotidienne_par_annee <- moyenne_quotidienne_par_ours_par_annee %>%
  group_by(year) %>%
  summarize(moyenne_globale = mean(moyenne_quotidienne, na.rm = TRUE))

# Créer un histogramme avec ggplot
graph_distance <- ggplot(moyenne_globale_quotidienne_par_annee, aes(x = year, y = moyenne_globale, fill = as.factor(year), text = moyenne_globale)) +
  geom_bar(stat = "identity") +
  scale_fill_viridis_d() +
  theme_minimal() +
  labs(fill = "Year", 
       x = "Year", 
       y = "Average weekly distance in metres", 
       title = "Average weekly distance travelled per year")

# Convertir le graphique ggplot en un graphique plotly interactif
# 'text' spécifie les informations à afficher dans l'info-bulle
p_plotly_distance_ours <- ggplotly(graph_distance, tooltip = "text")

# Afficher le graphique
p_plotly_distance_ours

In addition to temperature and ice cover in the Beaufort Sea, we want to add another variable to our data set. It seems important to us to reflect the number of active polar bears (i.e. transmitting GPS data) present in our data set on a date T. This is why we have created a “Bear Counter” function, which associates the number of active polar bears with each GPS point. This allows us to adjust our data set in anticipation of our analysis. The following graph shows this function and thus the evolution of the number of active polar bears in the study over the years. Here again we can see that our data is fairly heterogeneous from year to year. This reinforces our idea of increasing our understanding of the data set to develop a rigorous statistical analysis.

Code
plot_nb_ours <- ours_clean

plot_nb_ours$date <- as.Date(plot_nb_ours$date)
plot_nb_ours$year <- year(plot_nb_ours$date)

# Calculer la moyenne du nombre d'ours actifs par année et arrondir à l'entier supérieur
moyenne_ours_par_annee <- plot_nb_ours %>%
  group_by(year) %>%
  summarize(moyenne_ours = ceiling(mean(Count_Bears, na.rm = TRUE)))

# Créer un graphique avec ggplot
graph_ours_v1 <- ggplot(moyenne_ours_par_annee, aes(x = year, y = moyenne_ours, group = 1)) +
  geom_line() +
  scale_y_continuous(limits = c(0, 50)) + # Fixer les limites de l'axe Y si nécessaire
  theme_minimal() +
  labs(x = "Year", y = "Number of bears studied per year", title = "Number of bear observations")


# Animer le graphique
nb_ours_anime <- graph_ours_v1 + transition_reveal(year)

# Enregistrer l'animation
anim_save("/Users/zoedardare/Documents/Master Management/Data science in BA/Quarto polar bears_files/Data Ugo/animation_moyenne_ours.gif", animation = nb_ours_anime)

# Afficher l'animation
animate(nb_ours_anime)

We have been able to separate the temperatures into 4 seasons over the years. We then notice a very strong seasonality through the average temperatures. What’s more, we don’t specifically see an increase or decrease in these temperatures over time.

To represent the average ice cover in the Beaufort Sea, we have also chosen to divide it up by season. In the following graph, you can double-click on a season to isolate it from the others. As with temperature, there is a strong seasonal effect on the surface area (in km2) of ice in the Beaufort Sea. In addition, there is a tendency for this to decrease over the years.

Code
# Fonction pour déterminer la saison
#getSeason <- function(date) {
#  month <- as.numeric(format(date, "%m"))
#  if (month %in% c(3, 4, 5)) {
#    return("Spring")
#  } else if (month %in% c(6, 7, 8)) {
#    return("Summer")
#  } else if (month %in% c(9, 10, 11)) {
#    return("Fall")
# } else {
#    return("Winter")
#  }
#}


# Ajouter la colonne saison
#glace_beaufort_graph <- glace_beaufort %>%
#  mutate(season = sapply(date, getSeason))


#couleurs_saisons <- c("Spring" = "#89A45E",  
#                      "Summer" = "#7FC6BC",        
#                      "Fall" = "#D17A22",    
#                      "Winter" = "#5A7D9A")


# Création du graphique ggplot
#graph_beaufort <- ggplot(glace_beaufort_graph, aes(x = date, y = Beaufort_Sea, color = season)) +
#  geom_line() +
#  scale_color_manual(values = couleurs_saisons) +
#  theme_minimal() +
#  labs(title = "Extent of Beaufort Sea ice by year and season",
#       x = "Year",
#       y = "Extent of ice (km²)")

# Conversion en graphique interactif avec plotly
#graph_beaufort_interactif <- ggplotly(graph_beaufort)

# Afficher le graphique
#graph_beaufort_interactif

4.2 Can movement patterns of polar bears be predicted using GPS data?

Code Visualization

We can then plot the movements of each polar bear in our Beaufort Sea study on a map. What’s more, each GPS point is characterised by its year and the distance the polar bear has traveled since its last GPS fix. As the GPS points are not homogeneous depending on the BearID and the year, the track between the points is not the real trajectory of the polar bear selected. It presents the general idea of the journey made. For greater accuracy, it would be necessary to increase the number of GPS readings over time.

Code

predictions_complete$year <- format(as.Date(predictions_complete$date), "%Y")

create_heatmap_for_year <- function(year, data) {
  filtered_data <- data[data$year == year, ]
  
  m <- leaflet(filtered_data) %>%
    addTiles() %>%
    addHeatmap(lng = ~longitude, lat = ~latitude, intensity = ~1, blur = 20, max = 0.05, radius = 15) %>%
    addScaleBar(options = list(position = "bottomleft", maxWidth = 100, metric = TRUE, imperial = FALSE))
  
  saveWidget(m, file=paste0("heatmap_", year, ".html"), selfcontained = TRUE)
}

for(year in 2015:2020) {
  create_heatmap_for_year(year, predictions_complete)
}

4.3 Select a Year to display the Heatmap

5 Analysis

5.1 A decreasing polar bear population

We can see that the location of bears changes over time. As previously stated, an analysis based on the number of data points is of little relevance, as the bears were not specified in the data, and we can imagine an improvement in the methods and means put in place to obtain these measurements over time. What we can analyse, however, is the gradual shift towards the west in the measurements taken. We can imagine that as a result of global warming, bears are tending to seek out colder regions, and that while northern Alaska fulfilled this condition in the 80s and 90s, they now have to move to the even colder west of the country to find conditions that are conducive to their survival.

We can observe that the seals’ numbers oscillate yet show an overarching increase, which hints at their adaptability to environmental shifts—a resilience that might be bolstered by conservation measures. However, data irregularities, such as inconsistent collection frequencies and varying methodologies, could be obscuring the true narrative of these trends. These factors remind us to interpret the data cautiously.

Anyhow polar bears present a different story. The data, primarily from the American continent, indicate a concerning decrease in their population. The retreating Arctic ice is a clear signal of the climate crisis, stripping away the habitat crucial for the bears’ hunting and breeding. The data’s geographical limitations warrant a cautious approach to generalizing these findings across the glob.

From our study, we can observe that the decline in the number of polar bears is markedly more significant than the one of their primary prey, the seals. This pattern suggests a hypothesis: faced with an invisible enemy and the only predator of polar bears – climate change – these bears are in a dire situation. The warming climate leads to the ice in the bay forming later and melting earlier each year, which may abbreviate the seal hunting season to such an extent that polar bears may not have sufficient time to accumulate the fat reserves needed to survive their summer fast. The breeding cycle of the females could be disrupted, threatening the continuity of the species.

5.2 Impact of climate change on polar bear movement patterns and habitat utilization depicted by GPS data

Code
# Ajouter des variables saisonnières basées sur le mois
ours_clean <- ours_clean %>%
  mutate(date = ymd(date),
         month = month(date),
         season = case_when(
           month %in% c(12, 1, 2) ~ "Winter",
           month %in% c(3, 4, 5) ~ "Spring",
           month %in% c(6, 7, 8) ~ "Summer",
           month %in% c(9, 10, 11) ~ "Autumn",
           TRUE ~ NA_character_
         ))

# Convertir la saison en variable factorielle
ours_clean$season <- as.factor(ours_clean$season)

# Régression linéaire
model <- lm(Distance ~ Closest_Avg_Temperature + Count_Bears + latitude + longitude + season, data = ours_clean)

# Résumé du modèle
sum_mod<-summary(model)


# Conversion de la sortie de summary en data frame
coef_df1 <- as.data.frame(sum_mod$coefficients)

# Utilisation de formattable pour afficher le résumé
formattable(coef_df1)
Estimate Std. Error t value Pr(>|t|)
(Intercept) -15704.36 2148.12 -7.311 2.66e-13
Closest_Avg_Temperature -218.36 4.03 -54.149 0.00e+00
Count_Bears 98.31 4.69 20.982 1.16e-97
latitude 277.32 28.59 9.699 3.07e-22
longitude 4.61 3.24 1.422 1.55e-01
seasonSpring -4241.47 147.27 -28.801 4.17e-182
seasonSummer 39.89 149.27 0.267 7.89e-01
seasonWinter -3645.02 195.35 -18.659 1.20e-77
Code
# Convertir 'yyyyddd' en 'YYYY-MM-DD'
glace_beaufort$date <- as.Date(paste0(substr(glace_beaufort$yyyyddd, 1, 4), "-01-01")) +
  (as.numeric(substr(glace_beaufort$yyyyddd, 5, 7)) - 1)

# Fusionner les datasets sur la base de la date
dataset_regression <- left_join(ours_clean, glace_beaufort, by = "date")

# Filtrer pour ne garder que les données à partir de 2006
dataset_regression <- filter(dataset_regression, year(date) >= 2006)

# Régression linéaire sur le déplacement des ours
model <- lm(Distance ~ Closest_Avg_Temperature + Count_Bears + Beaufort_Sea, data = dataset_regression)

# Résumé du modèle
sum_mod2<-summary(model)

# Conversion de la sortie de summary en data frame
coef_df2 <- as.data.frame(sum_mod2$coefficients)

# Utilisation de formattable pour afficher le résumé
formattable(coef_df2)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.88e+03 3.65e+02 21.6 8.01e-103
Closest_Avg_Temperature 2.76e+02 1.34e+01 20.6 1.30e-93
Count_Bears 9.41e+01 5.43e+00 17.3 3.59e-67
Beaufort_Sea -7.27e-04 2.70e-04 -2.7 7.03e-03
Code

dataset_regression <- arrange(dataset_regression, bearid)

6 Conclusion

The comprehensive study on the impact of climate change on Arctic ecosystems, particularly focusing on polar bears, reveals significant findings and implications. Our investigation, driven by the urgent need to understand the effects of environmental shifts in the Arctic, combines extensive data analysis with predictive modeling to paint a detailed picture of the current and future state of polar bear populations and their habitats.

Key Findings

  • Declining Polar Bear Population: The data indicates a notable decline in polar bear numbers, particularly in regions like Alaska. This trend is alarming and points to the broader implications of shrinking sea ice and changing climatic conditions in the Arctic. The contrast with the ringed seals’ population trends, which show some resilience, underscores the unique challenges faced by polar bears.

  • Movement Patterns and Habitat Utilization: Our analysis of GPS data and environmental factors such as temperature and sea ice coverage reveals that polar bears’ movement patterns are intricately linked to these variables. The decreasing distances traveled by bears over the years suggest adaptations to the rapidly changing environment. Our predictive models, while indicating some level of accuracy, also highlight the complexity of these movement patterns.

  • Diet and Open Water Days: The relationship between the polar bears’ diet and the time they spend in open water is complex. Our statistical models suggest a connection, albeit not a straightforward one, between these factors. The impact of the melting season on bears’ dietary habits is evident but requires further exploration for conclusive insights.

Implications and Future Directions

The findings underscore the urgency for targeted conservation efforts aimed at preserving polar bear habitats, particularly in light of the diminishing sea ice cover in the Arctic. The insights gleaned from this study can inform policymakers and conservationists in formulating strategies that address the specific needs of polar bears, considering the broader context of climate change. Continued monitoring and research are vital to deepen our understanding of polar bears’ adaptation strategies to the changing environment. Future studies should aim to integrate more variables, such as human activities and their impact on bear habitats. Also, data on the location of bears in Alaska could be cross-referenced with changes in temperatures in different regions and the number of animals counted over time.

Concluding Remarks

In conclusion, this study highlights the profound impact of climate change on Arctic ecosystems, particularly on polar bears. The changing patterns in sea ice coverage and temperature regimes are not just altering the physical landscape but are also reshaping the life cycles and survival strategies of these iconic species. Our findings, while offering significant insights, also open the door for further research and action in the realm of wildlife conservation and climate change mitigation.