Hurricane Milton Abnormality

Hurricanes

Author

Logan Hales

Published

November 24, 2024

Introduction

#Hurricane Milton was an abnormal hurricane in the path it took throughout the Gulf of Mexico, Florida, and in the Atlantic Ocean when compared to other hurricanes during 2024, and in previous hurricane storm season as well. Because of this, I intend to analyze the track of Hurricane Milton through the Gulf of Mexico in comparison to other hurricanes and tropical storm that occurred in the Gulf of Mexico, and via the storm tracks and storm events such as rain and wind measurements of hurricanes from the past 20+ years. In order of doing this, I will be referring to different hurricane records taken from NOAA’s Historical Hurricanes and Tropical systems webpage, the CRAN Hurricane Exposure package and NOAA’s Historical Hurricane Tracks webpage, along with the in class lab’s data set from NOAA’s international-best-track-archive-for-climate-stewardship-ibtracs, as one of the beast means of analysis for the possible change sin strength of hurricane Milton when compared to these other hurricanes. With this, I will also be referring to the Intergovernmental Panel on Climate Change (IPCC) 2022 Sixth Assessment Report to make assessments of the possible strength future hurricanes and tropical storms may have, based on projections about climate change that are listed within the report.

Materials and methods

#The primary data being used in the R studio code was NOAA’s IBTrACS V04r01 CVS data, (Knapp et. al, 2010) & (Gahtan et. al, 2024), and the world & us_states data derived from NOAA swell, with the R studio packages of drat, sf, tidyverse, ggmap, lubridate, and tmap to sort and organize the NOAA data into the maps and plots provided below in the results section of the website.

#The code provided to do this separates the hurricane data recorded from hurricane Milton and to reintegrate it back into the whole hurricane data measured to show the differences in the path it took in comparison to other hurricanes between 2000-2020. The plots accomplish a similar method of comparing the differences between the pressure and wind speeds of hurricane Milton and every other hurricane between 2000 and 2020 but without combining them.

#The CSV file for NOAA’s hurricane data comes from the international-best-track-archive website. The world and us_states data are shape files that can be loaded in with the sf function in rstudio.

Narrative: Clear narrative description of the data sources and methods. Includes data from at least two sources that were integrated / merged in R.

Code: The code associated with the project is well organized and easy to follow. Demonstrates mastery of R graphics and functions.

Data: The underlying data are publicly accessible via the web and downloaded/accessed within the Rmd script. If you want to use your own data, you must make it available on a website (e.g. Figshare) so that others are able to re-run your code.

You can do bullets like this:

  • The first most important thing
  • The second most important thing
  • The third most important thing

You can do numbers like this:

  1. The first most important thing
  2. The second most important thing
  3. The third most important thing

See http://rmarkdown.rstudio.com/ for all the amazing things you can do.

Here’s my first code chunk.

#SCRIPT
if (!requireNamespace("drat", quietly = TRUE)) {
    install.packages("drat")
}
# Downloading packages -------------------------------------------------------
- Downloading drat from CRAN ...                OK [197.3 Kb in 0.74s]
Successfully downloaded 1 package in 1.9 seconds.

The following package(s) will be installed:
- drat [0.2.5]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing drat ...                           OK [installed binary and cached in 0.22s]
Successfully installed 1 package in 0.28 seconds.
library(drat)
addRepo("geanders")
install.packages("hurricaneexposure") 
# Downloading packages -------------------------------------------------------
- Downloading hurricaneexposure from CRAN ...   OK [1.9 Mb in 0.77s]
- Downloading ggmap from CRAN ...               OK [4.5 Mb in 0.67s]
- Downloading plyr from CRAN ...                OK [768 Kb in 0.34s]
- Downloading jpeg from CRAN ...                OK [28.6 Kb in 0.34s]
- Downloading bitops from CRAN ...              OK [25.4 Kb in 0.34s]
- Downloading mapproj from CRAN ...             OK [50.4 Kb in 0.62s]
- Downloading maps from CRAN ...                OK [2.9 Mb in 0.64s]
Successfully downloaded 7 packages in 6 seconds.

The following package(s) will be installed:
- bitops            [1.0-9]
- ggmap             [4.0.0]
- hurricaneexposure [0.1.1]
- jpeg              [0.1-10]
- mapproj           [1.2.11]
- maps              [3.4.2.1]
- plyr              [1.8.9]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing plyr ...                           OK [installed binary and cached in 0.28s]
- Installing jpeg ...                           OK [installed binary and cached in 0.2s]
- Installing bitops ...                         OK [installed binary and cached in 0.2s]
- Installing ggmap ...                          OK [installed binary and cached in 0.79s]
- Installing maps ...                           OK [installed binary and cached in 0.27s]
- Installing mapproj ...                        OK [installed binary and cached in 0.2s]
- Installing hurricaneexposure ...              OK [installed binary and cached in 0.55s]
Successfully installed 7 packages in 2.7 seconds.
install.packages("hurricaneexposuredata")
# Downloading packages -------------------------------------------------------
- Downloading hurricaneexposuredata from geanders ... OK [14.4 Mb in 0.49s]
Successfully downloaded 1 package in 0.81 seconds.

The following package(s) will be installed:
- hurricaneexposuredata [0.1.0]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing hurricaneexposuredata ...          OK [built from source and cached in 13s]
Successfully installed 1 package in 13 seconds.
if (!requireNamespace("sf", quietly = TRUE)) {
    install.packages("sf")
}
# Downloading packages -------------------------------------------------------
- Downloading sf from CRAN ...                  OK [3.6 Mb in 0.64s]
- Downloading classInt from CRAN ...            OK [487.3 Kb in 0.62s]
- Downloading e1071 from CRAN ...               OK [582.2 Kb in 0.34s]
- Downloading proxy from CRAN ...               OK [171.5 Kb in 0.34s]
- Downloading s2 from CRAN ...                  OK [2.1 Mb in 0.63s]
- Downloading wk from CRAN ...                  OK [1.7 Mb in 0.66s]
- Downloading units from CRAN ...               OK [354.5 Kb in 0.63s]
Successfully downloaded 7 packages in 4.8 seconds.

The following package(s) will be installed:
- classInt [0.4-10]
- e1071    [1.7-16]
- proxy    [0.4-27]
- s2       [1.1.7]
- sf       [1.0-19]
- units    [0.8-5]
- wk       [0.9.4]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing proxy ...                          OK [installed binary and cached in 0.21s]
- Installing e1071 ...                          OK [installed binary and cached in 0.22s]
- Installing classInt ...                       OK [installed binary and cached in 0.23s]
- Installing wk ...                             OK [installed binary and cached in 0.25s]
- Installing s2 ...                             OK [installed binary and cached in 0.34s]
- Installing units ...                          OK [installed binary and cached in 0.32s]
- Installing sf ...                             OK [installed binary and cached in 0.82s]
Successfully installed 7 packages in 2.6 seconds.
if (!requireNamespace("tidyverse", quietly = TRUE)) {
    install.packages("tidyverse")
}
if (!requireNamespace("ggmap", quietly = TRUE)) {
    install.packages("ggmap")
}
if (!requireNamespace("spData", quietly = TRUE)) {
    install.packages("spData")
}
# Downloading packages -------------------------------------------------------
- Downloading spData from CRAN ...              OK [4.3 Mb in 0.65s]
Successfully downloaded 1 package in 0.85 seconds.

The following package(s) will be installed:
- spData [2.3.3]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing spData ...                         OK [installed binary and cached in 0.42s]
Successfully installed 1 package in 0.49 seconds.
if (!requireNamespace("lubridate", quietly = TRUE)) {
    install.packages("lubridate")
}
if (!requireNamespace("hurricaneexposure", quietly = TRUE)) {
    install.packages("hurricaneexposure")
}
if (!requireNamespace("hurricaneexposuredata", quietly = TRUE)) {
    install.packages("hurricaneexposuredata")
}
if (!requireNamespace("tmap", quietly = TRUE)) {
    install.packages("tmap")
}
# Downloading packages -------------------------------------------------------
- Downloading tmap from CRAN ...                OK [3.6 Mb in 1.2s]
- Downloading tmaptools from CRAN ...           OK [168.5 Kb in 0.88s]
- Downloading lwgeom from CRAN ...              OK [468.5 Kb in 0.63s]
- Downloading stars from CRAN ...               OK [4.3 Mb in 0.72s]
- Downloading abind from CRAN ...               OK [63.6 Kb in 0.61s]
- Downloading dichromat from CRAN ...           OK [143 Kb in 0.34s]
- Downloading XML from CRAN ...                 OK [1.7 Mb in 0.63s]
- Downloading leafsync from CRAN ...            OK [823.7 Kb in 0.63s]
- Downloading leafem from CRAN ...              OK [3.4 Mb in 1.2s]
- Downloading geojsonsf from CRAN ...           OK [1.6 Mb in 0.64s]
- Downloading geometries from CRAN ...          OK [283.2 Kb in 0.72s]
- Downloading jsonify from CRAN ...             OK [628.8 Kb in 0.71s]
- Downloading rapidjsonr from CRAN ...          OK [126.4 Kb in 0.82s]
- Downloading sfheaders from CRAN ...           OK [471.7 Kb in 0.71s]
Successfully downloaded 14 packages in 12 seconds.

The following package(s) will be installed:
- abind      [1.4-8]
- dichromat  [2.0-0.1]
- geojsonsf  [2.0.3]
- geometries [0.2.4]
- jsonify    [1.2.2]
- leafem     [0.2.3]
- leafsync   [0.1.0]
- lwgeom     [0.2-14]
- rapidjsonr [1.2.0]
- sfheaders  [0.4.4]
- stars      [0.6-7]
- tmap       [3.3-4]
- tmaptools  [3.1-1]
- XML        [3.99-0.17]
These packages will be installed into "~/work/final-project-Logan-can/final-project-Logan-can/renv/library/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu".

# Installing packages --------------------------------------------------------
- Installing lwgeom ...                         OK [installed binary and cached in 0.48s]
- Installing abind ...                          OK [installed binary and cached in 0.21s]
- Installing stars ...                          OK [installed binary and cached in 0.67s]
- Installing dichromat ...                      OK [installed binary and cached in 0.2s]
- Installing XML ...                            OK [installed binary and cached in 0.35s]
- Installing tmaptools ...                      OK [installed binary and cached in 0.87s]
- Installing leafsync ...                       OK [installed binary and cached in 0.21s]
- Installing geometries ...                     OK [installed binary and cached in 0.28s]
- Installing rapidjsonr ...                     OK [installed binary and cached in 0.21s]
- Installing jsonify ...                        OK [installed binary and cached in 0.29s]
- Installing sfheaders ...                      OK [installed binary and cached in 0.29s]
- Installing geojsonsf ...                      OK [installed binary and cached in 0.3s]
- Installing leafem ...                         OK [installed binary and cached in 3.9s]
- Installing tmap ...                           OK [installed binary and cached in 4.3s]
Successfully installed 14 packages in 13 seconds.
library(sf)
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggmap)
ℹ Google's Terms of Service: <https://mapsplatform.google.com>
  Stadia Maps' Terms of Service: <https://stadiamaps.com/terms-of-service/>
  OpenStreetMap's Tile Usage Policy: <https://operations.osmfoundation.org/policies/tiles/>
ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
library(spData)
To access larger datasets in this package, install the spDataLarge
package with: `install.packages('spDataLarge',
repos='https://nowosad.github.io/drat/', type='source')`
library(lubridate)
library(hurricaneexposure)
library(hurricaneexposuredata)
data(world)
data(us_states)
library(tmap)
Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
remotes::install_github('r-tmap/tmap')
# Download a csv from noaa with storm track information
dataurl="https://www.ncei.noaa.gov/data/international-best-track-archive-for-climate-stewardship-ibtracs/v04r01/access/csv/ibtracs.NA.list.v04r01.csv"

storm_data <- read_csv(dataurl)
Rows: 127220 Columns: 174
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr  (149): SID, SEASON, BASIN, SUBBASIN, NAME, NATURE, LAT, LON, WMO_WIND, ...
dbl   (12): NUMBER, USA_SSHS, TOKYO_GRADE, TOKYO_LAND, CMA_CAT, NEWDELHI_CI,...
lgl   (12): TOKYO_R50_DIR, TOKYO_R30_DIR, HKO_CAT, KMA_CAT, KMA_R50_DIR, KMA...
dttm   (1): ISO_TIME

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
storm_data_new <- storm_data%>%
  mutate(year = year(ISO_TIME))%>%
  filter(year >= 2000) %>%
  mutate_if(is.numeric, function(x) ifelse(x==-999.0,NA,x)) %>%
  mutate(decade=(floor(year/10)*10))


sf_storm_data <- storm_data_new %>%
  st_as_sf(coords=c("LON","LAT"),crs=4326, remove = FALSE)

region <- st_bbox(sf_storm_data)

ggplot(data = world)+
  geom_sf()+
  stat_bin2d(data=storm_data_new, aes(y=st_coordinates(sf_storm_data)[,2], x=st_coordinates(sf_storm_data)[,1]),bins=100)+
  facet_wrap(~decade)+
  scale_fill_distiller(palette="YlOrRd", trans="log", direction=-1, breaks = c(1,10,100,1000))+
  coord_sf(ylim=region[c(2,4)], xlim=region[c(1,3)])

#26055, 26109
Milton_storm <- storm_data_new %>%
  mutate(year = year(ISO_TIME))%>%
  filter(year == 2024)%>%
  filter(NUMBER == 71)


Milton_storm_data <- Milton_storm %>%
  st_as_sf(coords=c("LON","LAT"),crs=4326, remove = FALSE)

region <- st_bbox(sf_storm_data)

Milton_Map <- ggplot(data = world)+
  geom_sf() + 
  stat_bin2d(data=Milton_storm_data, aes(y=st_coordinates(Milton_storm_data)[,2], 
  x=st_coordinates(Milton_storm_data)[,1]),bins=100)+
  scale_fill_distiller(palette="YlOrRd", 
  trans="log", direction=-1, breaks = c(1,10,100,1000))+
  coord_sf(ylim=region[c(2,4)], xlim=region[c(1,3)])

Milton_Map

Add any additional processing steps here.

Results

#The resulting data presented within the ggplot map that shows Hurricane Milton, (black), and the hurricane tracks, (coloured red to orange based on count),and the different boxplots and histograms measuring the Pressure and Wind records for both the overall hurricanes measured between 2000 and 2020 – and Milton, shows a clear difference within Milton’s tracks, pressure, and wind speed kept during its duration. The storm track for Milton in the ggplot map shows that formed in the Gulf of Mexico, moved north of 20 degrees longitude, taking a sharp right eastward through the middle of Florida to the Atlantic Ocean. Other hurricane tracks are visible moving across Central America to the pacific, and to parts of Europe, Canada, and the South-Central U.S. This is not to discount the abnormality of Milton but to compare it.

#The Box plots of Milton’s wind speed and pressure show a high interquartile range between the first and third quantiles, with the Hurricane wind speed and pressure having al low Interquartile range skewed to the left for both. The Histograms for Milton aswell show the pressure and wind measurements to be widely variable as well, which is not reflected in the Hurricane histograms, with the wind histogram, m being skewed to the right, and the pressure histogram being skewed to the left.

ggplot(data = world)+
  geom_sf()+
  stat_bin2d(data=storm_data_new, aes(y=st_coordinates(sf_storm_data)[,2], x=st_coordinates(sf_storm_data)[,1]),bins=100)+
  geom_sf(data = Milton_storm_data)+
  scale_fill_distiller(palette="YlOrRd", trans="log", direction=-1, breaks = c(1,10,100,1000))+
  coord_sf(ylim=region[c(2,4)], xlim=region[c(1,3)])

ggplot(Milton_storm_data, aes(x=as.numeric(USA_WIND)))+geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(Milton_storm_data, aes(x=as.numeric(USA_WIND)))+geom_boxplot()

ggplot(storm_data_new, aes(x=as.numeric(USA_WIND)))+geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(storm_data_new, aes(x=as.numeric(USA_WIND)))+geom_boxplot()

ggplot(Milton_storm_data, aes(x=as.numeric(USA_PRES)))+geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Warning: Removed 8 rows containing non-finite outside the scale range
(`stat_bin()`).

ggplot(Milton_storm_data, aes(x=as.numeric(USA_PRES)))+geom_boxplot()
Warning: Removed 8 rows containing non-finite outside the scale range
(`stat_boxplot()`).

ggplot(storm_data_new, aes(x=as.numeric(USA_PRES)))+geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Warning: Removed 42 rows containing non-finite outside the scale range
(`stat_bin()`).

ggplot(storm_data_new, aes(x=as.numeric(USA_WIND)))+geom_boxplot()

ggplot(Milton_storm_data, aes(x=as.numeric(USA_WIND)), storm_data_new, aes(x=as.numeric(USA_WIND)))+geom_boxplot()

Conclusions

[~200 words]

Clear summary adequately describing the results and putting them in context. Discussion of further questions and ways to continue investigation.

References

All sources are cited in a consistent manner