This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(dplyr)  
library(ggplot2)
library(tidyr)  
library(zoo)    

# Load the datasets
df_Tahiti <- read.csv("CE203N_2025 - HW 2 - Data_Tahiti.csv")
df_Darwin <- read.csv("CE203N_2025 - HW 2 - Data_Darwin.csv")

# Ensure the "Year" column is numeric
df_Tahiti$Year <- as.numeric(df_Tahiti$Year)
df_Darwin$Year <- as.numeric(df_Darwin$Year)

# Compute Monthly Pressure Differences (Tahiti - Darwin)
df_Difference <- df_Tahiti
df_Difference[,-1] <- df_Tahiti[,-1] - df_Darwin[,-1]

# Convert to Long Format
df_long <- df_Difference %>%
  pivot_longer(-Year, names_to = "Month", values_to = "Pressure_Diff") 

# Compute Climatology (1951-1980) - Monthly Mean and SD
climatology <- df_long %>%
  filter(Year >= 1951 & Year <= 1980) %>%
  group_by(Month) %>%
  summarise(Mean = mean(Pressure_Diff, na.rm=TRUE), SD = sd(Pressure_Diff, na.rm=TRUE), .groups="drop")

# Compute Standardized SOI
df_long <- df_long %>%
  left_join(climatology, by="Month") %>%
  mutate(SOI = (Pressure_Diff - Mean) / SD) %>%
  select(Year, Month, SOI) %>%
  arrange(Year)

# Convert Month names to numerical order for proper sorting
df_long$Month <- match(df_long$Month, month.abb)  # Convert "Jan" -> 1, "Feb" -> 2, etc.

# Compute 12-Month Running Mean for Smoothing
df_long <- df_long %>%
  arrange(Year, Month) %>%
  mutate(SOI_smoothed = zoo::rollmean(SOI, k = 12, fill = NA, align = "center"))

# Remove NA values
df_long <- df_long %>% filter(!is.na(SOI_smoothed))

# Plot the SOI
ggplot(df_long, aes(x = Year + (Month-1)/12, y = SOI_smoothed, fill = factor(SOI_smoothed > 0))) +
  geom_col(width = 0.5) +  # Reduce width to make bars thinner
  scale_fill_manual(values = c("FALSE" = "red", "TRUE" = "blue"), labels = c("Warm (El Nina)", "Cool (La Nina)")) +
  theme_minimal() +
  scale_x_continuous(breaks = seq(1880, 2020, by = 20)) +  
  labs(title = "Southern Oscillation Index",
       subtitle = "Smoothed 1-Year Running Mean",
       x = "Year", y = "SOI") +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, hjust = 1))

NA
NA

# Constants
T_surf <- 295  # Surface temperature in K
P0 <- 98000  # Surface pressure in Pa
g <- 9.81  # Gravity (m/s^2)
Rd <- 287  # Specific gas constant for dry air (J/kg.K)
Gamma_d <- 9.8 / 1000  # Convert lapse rate to K/m
epsilon <- 0.622  # Ratio of water vapor to dry air

# Generate height range (0 to 5 km)
z <- seq(0, 5000, length.out = 100)  # Height in meters

# Compute temperature profile
T_z <- T_surf - Gamma_d * z

# Compute pressure profile using hydrostatic approximation
P_z <- P0 * (T_z / T_surf)^(g / (Rd * Gamma_d))

# Compute saturation vapor pressure (Clausius-Clapeyron equation)
e_s <- 6.112 * exp((17.67 * (T_z - 273.15)) / (T_z - 29.65)) * 100  # Convert hPa to Pa

# Compute saturated specific humidity
q_s <- (epsilon * e_s) / (P_z - e_s)

# Create a dataframe for ggplot
df <- data.frame(T_z, q_s)

# Plot using ggplot2
ggplot(df, aes(x = z, y = q_s)) +
  geom_line(color = "blue", size = 1.2) +
  labs(x = "Altitude", 
       y = "Saturated Specific Humidity (kg/kg)", 
       title = "Saturated Specific Humidity vs. Altitude") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

```

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCmBgYHtyfQ0KbGlicmFyeShkcGx5cikgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5cikgIA0KbGlicmFyeSh6b28pICAgIA0KDQojIExvYWQgdGhlIGRhdGFzZXRzDQpkZl9UYWhpdGkgPC0gcmVhZC5jc3YoIkNFMjAzTl8yMDI1IC0gSFcgMiAtIERhdGFfVGFoaXRpLmNzdiIpDQpkZl9EYXJ3aW4gPC0gcmVhZC5jc3YoIkNFMjAzTl8yMDI1IC0gSFcgMiAtIERhdGFfRGFyd2luLmNzdiIpDQoNCiMgRW5zdXJlIHRoZSAiWWVhciIgY29sdW1uIGlzIG51bWVyaWMNCmRmX1RhaGl0aSRZZWFyIDwtIGFzLm51bWVyaWMoZGZfVGFoaXRpJFllYXIpDQpkZl9EYXJ3aW4kWWVhciA8LSBhcy5udW1lcmljKGRmX0RhcndpbiRZZWFyKQ0KDQojIENvbXB1dGUgTW9udGhseSBQcmVzc3VyZSBEaWZmZXJlbmNlcyAoVGFoaXRpIC0gRGFyd2luKQ0KZGZfRGlmZmVyZW5jZSA8LSBkZl9UYWhpdGkNCmRmX0RpZmZlcmVuY2VbLC0xXSA8LSBkZl9UYWhpdGlbLC0xXSAtIGRmX0RhcndpblssLTFdDQoNCiMgQ29udmVydCB0byBMb25nIEZvcm1hdA0KZGZfbG9uZyA8LSBkZl9EaWZmZXJlbmNlICU+JQ0KICBwaXZvdF9sb25nZXIoLVllYXIsIG5hbWVzX3RvID0gIk1vbnRoIiwgdmFsdWVzX3RvID0gIlByZXNzdXJlX0RpZmYiKSANCg0KIyBDb21wdXRlIENsaW1hdG9sb2d5ICgxOTUxLTE5ODApIC0gTW9udGhseSBNZWFuIGFuZCBTRA0KY2xpbWF0b2xvZ3kgPC0gZGZfbG9uZyAlPiUNCiAgZmlsdGVyKFllYXIgPj0gMTk1MSAmIFllYXIgPD0gMTk4MCkgJT4lDQogIGdyb3VwX2J5KE1vbnRoKSAlPiUNCiAgc3VtbWFyaXNlKE1lYW4gPSBtZWFuKFByZXNzdXJlX0RpZmYsIG5hLnJtPVRSVUUpLCBTRCA9IHNkKFByZXNzdXJlX0RpZmYsIG5hLnJtPVRSVUUpLCAuZ3JvdXBzPSJkcm9wIikNCg0KIyBDb21wdXRlIFN0YW5kYXJkaXplZCBTT0kNCmRmX2xvbmcgPC0gZGZfbG9uZyAlPiUNCiAgbGVmdF9qb2luKGNsaW1hdG9sb2d5LCBieT0iTW9udGgiKSAlPiUNCiAgbXV0YXRlKFNPSSA9IChQcmVzc3VyZV9EaWZmIC0gTWVhbikgLyBTRCkgJT4lDQogIHNlbGVjdChZZWFyLCBNb250aCwgU09JKSAlPiUNCiAgYXJyYW5nZShZZWFyKQ0KDQojIENvbnZlcnQgTW9udGggbmFtZXMgdG8gbnVtZXJpY2FsIG9yZGVyIGZvciBwcm9wZXIgc29ydGluZw0KZGZfbG9uZyRNb250aCA8LSBtYXRjaChkZl9sb25nJE1vbnRoLCBtb250aC5hYmIpICAjIENvbnZlcnQgIkphbiIgLT4gMSwgIkZlYiIgLT4gMiwgZXRjLg0KDQojIENvbXB1dGUgMTItTW9udGggUnVubmluZyBNZWFuIGZvciBTbW9vdGhpbmcNCmRmX2xvbmcgPC0gZGZfbG9uZyAlPiUNCiAgYXJyYW5nZShZZWFyLCBNb250aCkgJT4lDQogIG11dGF0ZShTT0lfc21vb3RoZWQgPSB6b286OnJvbGxtZWFuKFNPSSwgayA9IDEyLCBmaWxsID0gTkEsIGFsaWduID0gImNlbnRlciIpKQ0KDQojIFJlbW92ZSBOQSB2YWx1ZXMNCmRmX2xvbmcgPC0gZGZfbG9uZyAlPiUgZmlsdGVyKCFpcy5uYShTT0lfc21vb3RoZWQpKQ0KDQojIFBsb3QgdGhlIFNPSQ0KZ2dwbG90KGRmX2xvbmcsIGFlcyh4ID0gWWVhciArIChNb250aC0xKS8xMiwgeSA9IFNPSV9zbW9vdGhlZCwgZmlsbCA9IGZhY3RvcihTT0lfc21vb3RoZWQgPiAwKSkpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAwLjUpICsgICMgUmVkdWNlIHdpZHRoIHRvIG1ha2UgYmFycyB0aGlubmVyDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkZBTFNFIiA9ICJyZWQiLCAiVFJVRSIgPSAiYmx1ZSIpLCBsYWJlbHMgPSBjKCJXYXJtIChFbCBOaW5hKSIsICJDb29sIChMYSBOaW5hKSIpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTg4MCwgMjAyMCwgYnkgPSAyMCkpICsgIA0KICBsYWJzKHRpdGxlID0gIlNvdXRoZXJuIE9zY2lsbGF0aW9uIEluZGV4IiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTbW9vdGhlZCAxLVllYXIgUnVubmluZyBNZWFuIiwNCiAgICAgICB4ID0gIlllYXIiLCB5ID0gIlNPSSIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KDQoNCmBgYA0KYGBge3J9DQoNCiMgQ29uc3RhbnRzDQpUX3N1cmYgPC0gMjk1ICAjIFN1cmZhY2UgdGVtcGVyYXR1cmUgaW4gSw0KUDAgPC0gOTgwMDAgICMgU3VyZmFjZSBwcmVzc3VyZSBpbiBQYQ0KZyA8LSA5LjgxICAjIEdyYXZpdHkgKG0vc14yKQ0KUmQgPC0gMjg3ICAjIFNwZWNpZmljIGdhcyBjb25zdGFudCBmb3IgZHJ5IGFpciAoSi9rZy5LKQ0KR2FtbWFfZCA8LSA5LjggLyAxMDAwICAjIENvbnZlcnQgbGFwc2UgcmF0ZSB0byBLL20NCmVwc2lsb24gPC0gMC42MjIgICMgUmF0aW8gb2Ygd2F0ZXIgdmFwb3IgdG8gZHJ5IGFpcg0KDQojIEdlbmVyYXRlIGhlaWdodCByYW5nZSAoMCB0byA1IGttKQ0KeiA8LSBzZXEoMCwgNTAwMCwgbGVuZ3RoLm91dCA9IDEwMCkgICMgSGVpZ2h0IGluIG1ldGVycw0KDQojIENvbXB1dGUgdGVtcGVyYXR1cmUgcHJvZmlsZQ0KVF96IDwtIFRfc3VyZiAtIEdhbW1hX2QgKiB6DQoNCiMgQ29tcHV0ZSBwcmVzc3VyZSBwcm9maWxlIHVzaW5nIGh5ZHJvc3RhdGljIGFwcHJveGltYXRpb24NClBfeiA8LSBQMCAqIChUX3ogLyBUX3N1cmYpXihnIC8gKFJkICogR2FtbWFfZCkpDQoNCiMgQ29tcHV0ZSBzYXR1cmF0aW9uIHZhcG9yIHByZXNzdXJlIChDbGF1c2l1cy1DbGFwZXlyb24gZXF1YXRpb24pDQplX3MgPC0gNi4xMTIgKiBleHAoKDE3LjY3ICogKFRfeiAtIDI3My4xNSkpIC8gKFRfeiAtIDI5LjY1KSkgKiAxMDAgICMgQ29udmVydCBoUGEgdG8gUGENCg0KIyBDb21wdXRlIHNhdHVyYXRlZCBzcGVjaWZpYyBodW1pZGl0eQ0KcV9zIDwtIChlcHNpbG9uICogZV9zKSAvIChQX3ogLSBlX3MpDQoNCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIGZvciBnZ3Bsb3QNCmRmIDwtIGRhdGEuZnJhbWUoVF96LCBxX3MpDQoNCiMgUGxvdCB1c2luZyBnZ3Bsb3QyDQpnZ3Bsb3QoZGYsIGFlcyh4ID0geiwgeSA9IHFfcykpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsdWUiLCBzaXplID0gMS4yKSArDQogIGxhYnMoeCA9ICJBbHRpdHVkZSIsIA0KICAgICAgIHkgPSAiU2F0dXJhdGVkIFNwZWNpZmljIEh1bWlkaXR5IChrZy9rZykiLCANCiAgICAgICB0aXRsZSA9ICJTYXR1cmF0ZWQgU3BlY2lmaWMgSHVtaWRpdHkgdnMuIEFsdGl0dWRlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKQ0KDQpgYGANCg0KYGBgDQoNCg==