#packages

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(sf)
## Warning: package 'sf' was built under R version 4.5.3
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
library(spdep)
## Warning: package 'spdep' was built under R version 4.5.3
## Loading required package: spData
## Warning: package 'spData' was built under R version 4.5.3
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
library(tmap)
library(broom)
#excel sheets

file_path <- "C:/Users/noahs/Downloads/Stockton_Combined_Remote_Sensing_Indicators.xlsx"

lst <- read_excel(file_path, sheet = "LST")
## New names:
## • `` -> `...9`
albedo <- read_excel(file_path, sheet = "Albedo")
## New names:
## • `` -> `...21`
imp <- read_excel(file_path, sheet = "Impervious")

ndvi <- read_excel(file_path, sheet = "NDVI")
## New names:
## • `` -> `...14`
ndbi <- read_excel(file_path, sheet = "NDBI")
## New names:
## • `` -> `...14`
# ===============================
# RENAME GEOID COLUMNS
# ===============================


albedo <- albedo %>%
  rename(GEOID = tl_2020_09)

imp <- imp %>%
  rename(GEOID = tl_2020_09)

ndvi <- ndvi %>%
  rename(GEOID = tl_2020_09)

ndbi <- ndbi %>%
  rename(GEOID = tl_2020_09)


# ===============================
# CONVERT DATA TYPES
# ===============================

lst <- lst %>%
  mutate(
    GEOID = as.character(GEOID),
    across(c(Year, mean, min, max, stdDev), as.numeric)
  )
## Warning: There were 5 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(c(Year, mean, min, max, stdDev), as.numeric)`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
ndvi <- ndvi %>%
  mutate(
    GEOID = as.character(GEOID),
    across(c(Year, mean, min, max, stdDev), as.numeric)
  )
## Warning: There were 5 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(c(Year, mean, min, max, stdDev), as.numeric)`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
ndbi <- ndbi %>%
  mutate(
    GEOID = as.character(GEOID),
    across(c(Year, mean, min, max, stdDev), as.numeric)
  )
## Warning: There were 5 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(c(Year, mean, min, max, stdDev), as.numeric)`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
albedo <- albedo %>%
  mutate(
    GEOID = as.character(GEOID),
    across(
      c(
        Mean_Albedo_mean,
        Mean_Albedo_stdDev,
        Low_Albedo_mean,
        Low_Albedo_stdDev,
        High_Albedo_mean,
        High_Albedo_stdDev
      ),
      as.numeric
    )
  )
## Warning: There were 6 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(...)`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 5 remaining warnings.
imp <- imp %>%
  mutate(
    GEOID = as.character(GEOID),
    across(
      c(
        mean_impervious_pct,
        min_impervious_pct,
        max_impervious_pct,
        stdDev_impervious_pct,
        pct_impervious_gt70
      ),
      as.numeric
    )
  )
## Warning: There were 5 warnings in `mutate()`.
## The first warning was:
## ℹ In argument: `across(...)`.
## Caused by warning:
## ! NAs introduced by coercion
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
# ===============================
# CLEAN LST, NDVI, NDBI
# ===============================

lst_clean <- lst %>%
  select(GEOID, Year, mean, min, max, stdDev) %>%
  rename(
    LST_mean = mean,
    LST_min = min,
    LST_max = max,
    LST_stdDev = stdDev
  )

ndvi_clean <- ndvi %>%
  select(GEOID, Year, mean, min, max, stdDev) %>%
  rename(
    NDVI_mean = mean,
    NDVI_min = min,
    NDVI_max = max,
    NDVI_stdDev = stdDev
  )

ndbi_clean <- ndbi %>%
  select(GEOID, Year, mean, min, max, stdDev) %>%
  rename(
    NDBI_mean = mean,
    NDBI_min = min,
    NDBI_max = max,
    NDBI_stdDev = stdDev
  )


# ===============================
# CLEAN ALBEDO
# ===============================

albedo_clean <- albedo %>%
  select(
    GEOID,
    Mean_Albedo_mean,
    Mean_Albedo_stdDev,
    Low_Albedo_mean,
    Low_Albedo_stdDev,
    High_Albedo_mean,
    High_Albedo_stdDev
  )


# ===============================
# CLEAN IMPERVIOUS
# ===============================

imp_clean <- imp %>%
  select(
    GEOID,
    mean_impervious_pct,
    min_impervious_pct,
    max_impervious_pct,
    stdDev_impervious_pct,
    pct_impervious_gt70
  ) %>%
  rename(
    Impervious_mean = mean_impervious_pct,
    Impervious_min = min_impervious_pct,
    Impervious_max = max_impervious_pct,
    Impervious_stdDev = stdDev_impervious_pct,
    Impervious_gt70_pct = pct_impervious_gt70
  )


# ===============================
# MERGE ALL DATASETS
# ===============================

combined <- lst_clean %>%
  left_join(ndvi_clean, by = c("GEOID", "Year")) %>%
  left_join(ndbi_clean, by = c("GEOID", "Year")) %>%
  left_join(albedo_clean, by = "GEOID") %>%
  left_join(imp_clean, by = "GEOID")
## Warning in left_join(., ndvi_clean, by = c("GEOID", "Year")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 87 of `x` matches multiple rows in `y`.
## ℹ Row 87 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
## Warning in left_join(., ndbi_clean, by = c("GEOID", "Year")): Detected an unexpected many-to-many relationship between `x` and `y`.
## ℹ Row 87 of `x` matches multiple rows in `y`.
## ℹ Row 87 of `y` matches multiple rows in `x`.
## ℹ If a many-to-many relationship is expected, set `relationship =
##   "many-to-many"` to silence this warning.
# ===============================
# CHECK FINAL DATASET
# ===============================

str(combined)
## tibble [17,775 × 25] (S3: tbl_df/tbl/data.frame)
##  $ GEOID              : chr [1:17775] "6077000401" "6077000402" "6077000500" "6077000600" ...
##  $ Year               : num [1:17775] 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
##  $ LST_mean           : num [1:17775] 38.6 39.7 41.3 42.2 38.4 ...
##  $ LST_min            : num [1:17775] 34.1 32.7 36.5 36.5 33.4 ...
##  $ LST_max            : num [1:17775] 42.4 46.9 46.1 45.5 42.2 ...
##  $ LST_stdDev         : num [1:17775] 1.29 2.18 1.55 1.31 1.72 ...
##  $ NDVI_mean          : num [1:17775] 0.371 0.315 0.212 0.195 0.367 ...
##  $ NDVI_min           : num [1:17775] 0.051941 0.002041 0.000519 0.017171 0.02344 ...
##  $ NDVI_max           : num [1:17775] 0.619 0.723 0.63 0.671 0.737 ...
##  $ NDVI_stdDev        : num [1:17775] 0.0919 0.1526 0.1193 0.1091 0.1277 ...
##  $ NDBI_mean          : num [1:17775] -0.1361 -0.0894 -0.0391 -0.0172 -0.1071 ...
##  $ NDBI_min           : num [1:17775] -0.306 -0.356 -0.296 -0.31 -0.383 ...
##  $ NDBI_max           : num [1:17775] 0.0914 0.1757 0.2031 0.1645 0.1075 ...
##  $ NDBI_stdDev        : num [1:17775] 0.0562 0.0876 0.0757 0.0744 0.0761 ...
##  $ Mean_Albedo_mean   : num [1:17775] 0.139 0.152 0.146 0.152 0.157 ...
##  $ Mean_Albedo_stdDev : num [1:17775] 0.0166 0.039 0.0272 0.0323 0.0339 ...
##  $ Low_Albedo_mean    : num [1:17775] 0.835 0.604 0.634 0.551 0.428 ...
##  $ Low_Albedo_stdDev  : num [1:17775] 0.365 0.487 0.48 0.496 0.498 ...
##  $ High_Albedo_mean   : num [1:17775] 0 0.00922 0.00072 0.0062 0.00299 ...
##  $ High_Albedo_stdDev : num [1:17775] 0 0.0933 0.026 0.0761 0.0505 ...
##  $ Impervious_mean    : num [1:17775] 61.7 67 76.5 74.7 57 ...
##  $ Impervious_min     : num [1:17775] 22 1 27 1 0 1 1 1 39 0 ...
##  $ Impervious_max     : num [1:17775] 100 100 100 100 100 100 100 100 100 100 ...
##  $ Impervious_stdDev  : num [1:17775] 11.7 20.9 14.9 16.4 19.8 ...
##  $ Impervious_gt70_pct: num [1:17775] 20.9 50.8 68.8 67.8 25 ...
summary(combined)
##     GEOID                Year          LST_mean        LST_min      
##  Length:17775       Min.   :2000    Min.   :34.10   Min.   : 7.473  
##  Class :character   1st Qu.:2006    1st Qu.:40.30   1st Qu.:31.588  
##  Mode  :character   Median :2012    Median :41.93   Median :34.908  
##                     Mean   :2012    Mean   :41.76   Mean   :34.331  
##                     3rd Qu.:2018    3rd Qu.:43.47   3rd Qu.:37.317  
##                     Max.   :2024    Max.   :48.24   Max.   :45.220  
##                     NA's   :15625   NA's   :15625   NA's   :15625   
##     LST_max        LST_stdDev       NDVI_mean         NDVI_min      
##  Min.   :40.63   Min.   :0.2189   Min.   :0.1106   Min.   :-0.7067  
##  1st Qu.:45.45   1st Qu.:1.4739   1st Qu.:0.2421   1st Qu.:-0.0172  
##  Median :47.17   Median :1.8915   Median :0.2935   Median : 0.0165  
##  Mean   :47.57   Mean   :2.1787   Mean   :0.2914   Mean   :-0.0219  
##  3rd Qu.:48.99   3rd Qu.:2.6570   3rd Qu.:0.3456   3rd Qu.: 0.0429  
##  Max.   :72.19   Max.   :6.7986   Max.   :0.5224   Max.   : 0.1460  
##  NA's   :15625   NA's   :15625    NA's   :15625    NA's   :15625    
##     NDVI_max       NDVI_stdDev       NDBI_mean          NDBI_min      
##  Min.   :0.3323   Min.   :0.0431   Min.   :-0.1891   Min.   :-0.8918  
##  1st Qu.:0.7022   1st Qu.:0.0994   1st Qu.:-0.0904   1st Qu.:-0.4090  
##  Median :0.7436   Median :0.1203   Median :-0.0576   Median :-0.3503  
##  Mean   :0.7334   Mean   :0.1256   Mean   :-0.0556   Mean   :-0.3618  
##  3rd Qu.:0.7842   3rd Qu.:0.1407   3rd Qu.:-0.0225   3rd Qu.:-0.3031  
##  Max.   :0.8956   Max.   :0.2645   Max.   : 0.1359   Max.   :-0.0227  
##  NA's   :15625    NA's   :15625    NA's   :15625     NA's   :15625    
##     NDBI_max       NDBI_stdDev     Mean_Albedo_mean Mean_Albedo_stdDev
##  Min.   :0.0527   Min.   :0.0422   Min.   :0.1160   Min.   :0.0155    
##  1st Qu.:0.1441   1st Qu.:0.0682   1st Qu.:0.1455   1st Qu.:0.0281    
##  Median :0.1965   Median :0.0802   Median :0.1542   Median :0.0351    
##  Mean   :0.2108   Mean   :0.0866   Mean   :0.1553   Mean   :0.0378    
##  3rd Qu.:0.2441   3rd Qu.:0.0938   3rd Qu.:0.1641   3rd Qu.:0.0434    
##  Max.   :0.6444   Max.   :0.3142   Max.   :0.2129   Max.   :0.1145    
##  NA's   :15625    NA's   :15625    NA's   :15625    NA's   :15625     
##  Low_Albedo_mean  Low_Albedo_stdDev High_Albedo_mean High_Albedo_stdDev
##  Min.   :0.1353   Min.   :0.3125    Min.   :0.0000   Min.   :0.0000    
##  1st Qu.:0.3766   1st Qu.:0.4335    1st Qu.:0.0000   1st Qu.:0.0000    
##  Median :0.5045   Median :0.4845    Median :0.0033   Median :0.0557    
##  Mean   :0.5164   Mean   :0.4565    Mean   :0.0109   Mean   :0.0674    
##  3rd Qu.:0.6337   3rd Qu.:0.4976    3rd Qu.:0.0106   3rd Qu.:0.0994    
##  Max.   :0.8967   Max.   :0.5000    Max.   :0.1378   Max.   :0.3393    
##  NA's   :15625    NA's   :15625     NA's   :15625    NA's   :15625     
##  Impervious_mean  Impervious_min  Impervious_max   Impervious_stdDev
##  Min.   : 7.385   Min.   : 0.00   Min.   : 95.00   Min.   :11.70    
##  1st Qu.:50.508   1st Qu.: 0.00   1st Qu.:100.00   1st Qu.:19.16    
##  Median :60.177   Median : 0.00   Median :100.00   Median :22.55    
##  Mean   :57.117   Mean   : 1.57   Mean   : 99.76   Mean   :23.37    
##  3rd Qu.:65.002   3rd Qu.: 1.00   3rd Qu.:100.00   3rd Qu.:26.62    
##  Max.   :84.825   Max.   :39.00   Max.   :100.00   Max.   :40.11    
##  NA's   :15625    NA's   :15625   NA's   :15625    NA's   :15625    
##  Impervious_gt70_pct
##  Min.   : 3.289     
##  1st Qu.:22.261     
##  Median :33.676     
##  Mean   :36.019     
##  3rd Qu.:48.425     
##  Max.   :86.388     
##  NA's   :15625
nrow(combined)
## [1] 17775
head(combined)
## # A tibble: 6 × 25
##   GEOID     Year LST_mean LST_min LST_max LST_stdDev NDVI_mean NDVI_min NDVI_max
##   <chr>    <dbl>    <dbl>   <dbl>   <dbl>      <dbl>     <dbl>    <dbl>    <dbl>
## 1 6077000…  2000     38.6    34.1    42.4       1.29     0.371  5.19e-2    0.619
## 2 6077000…  2000     39.7    32.7    46.9       2.18     0.315  2.04e-3    0.723
## 3 6077000…  2000     41.3    36.5    46.1       1.55     0.212  5.19e-4    0.630
## 4 6077000…  2000     42.2    36.5    45.5       1.31     0.195  1.72e-2    0.671
## 5 6077001…  2000     38.4    33.4    42.2       1.72     0.367  2.34e-2    0.737
## 6 6077001…  2000     39.0    30.6    44.0       2.59     0.355 -7.09e-3    0.696
## # ℹ 16 more variables: NDVI_stdDev <dbl>, NDBI_mean <dbl>, NDBI_min <dbl>,
## #   NDBI_max <dbl>, NDBI_stdDev <dbl>, Mean_Albedo_mean <dbl>,
## #   Mean_Albedo_stdDev <dbl>, Low_Albedo_mean <dbl>, Low_Albedo_stdDev <dbl>,
## #   High_Albedo_mean <dbl>, High_Albedo_stdDev <dbl>, Impervious_mean <dbl>,
## #   Impervious_min <dbl>, Impervious_max <dbl>, Impervious_stdDev <dbl>,
## #   Impervious_gt70_pct <dbl>
# ===============================
# export
# ===============================

write.csv(
  combined,
  "C:/Users/noahs/Downloads/Stockton_Clean_Combined_Remote_Sensing_2000_2024.csv",
  row.names = FALSE
)
combined <- read.csv("C:/Users/noahs/Downloads/Stockton_Clean_Combined_Remote_Sensing_2000_2024.csv")

str(combined)
## 'data.frame':    17775 obs. of  25 variables:
##  $ GEOID              : chr  "6077000401" "6077000402" "6077000500" "6077000600" ...
##  $ Year               : int  2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ...
##  $ LST_mean           : num  38.6 39.7 41.3 42.2 38.4 ...
##  $ LST_min            : num  34.1 32.7 36.5 36.5 33.4 ...
##  $ LST_max            : num  42.4 46.9 46.1 45.5 42.2 ...
##  $ LST_stdDev         : num  1.29 2.18 1.55 1.31 1.72 ...
##  $ NDVI_mean          : num  0.371 0.315 0.212 0.195 0.367 ...
##  $ NDVI_min           : num  0.051941 0.002041 0.000519 0.017171 0.02344 ...
##  $ NDVI_max           : num  0.619 0.723 0.63 0.671 0.737 ...
##  $ NDVI_stdDev        : num  0.0919 0.1526 0.1193 0.1091 0.1277 ...
##  $ NDBI_mean          : num  -0.1361 -0.0894 -0.0391 -0.0172 -0.1071 ...
##  $ NDBI_min           : num  -0.306 -0.356 -0.296 -0.31 -0.383 ...
##  $ NDBI_max           : num  0.0914 0.1757 0.2031 0.1645 0.1075 ...
##  $ NDBI_stdDev        : num  0.0562 0.0876 0.0757 0.0744 0.0761 ...
##  $ Mean_Albedo_mean   : num  0.139 0.152 0.146 0.152 0.157 ...
##  $ Mean_Albedo_stdDev : num  0.0166 0.039 0.0272 0.0323 0.0339 ...
##  $ Low_Albedo_mean    : num  0.835 0.604 0.634 0.551 0.428 ...
##  $ Low_Albedo_stdDev  : num  0.365 0.487 0.48 0.496 0.498 ...
##  $ High_Albedo_mean   : num  0 0.00922 0.00072 0.0062 0.00299 ...
##  $ High_Albedo_stdDev : num  0 0.0933 0.026 0.0761 0.0505 ...
##  $ Impervious_mean    : num  61.7 67 76.5 74.7 57 ...
##  $ Impervious_min     : int  22 1 27 1 0 1 1 1 39 0 ...
##  $ Impervious_max     : int  100 100 100 100 100 100 100 100 100 100 ...
##  $ Impervious_stdDev  : num  11.7 20.9 14.9 16.4 19.8 ...
##  $ Impervious_gt70_pct: num  20.9 50.8 68.8 67.8 25 ...
summary(combined)
##     GEOID                Year          LST_mean        LST_min      
##  Length:17775       Min.   :2000    Min.   :34.10   Min.   : 7.473  
##  Class :character   1st Qu.:2006    1st Qu.:40.30   1st Qu.:31.588  
##  Mode  :character   Median :2012    Median :41.93   Median :34.908  
##                     Mean   :2012    Mean   :41.76   Mean   :34.331  
##                     3rd Qu.:2018    3rd Qu.:43.47   3rd Qu.:37.317  
##                     Max.   :2024    Max.   :48.24   Max.   :45.220  
##                     NA's   :15625   NA's   :15625   NA's   :15625   
##     LST_max        LST_stdDev       NDVI_mean         NDVI_min      
##  Min.   :40.63   Min.   :0.2189   Min.   :0.1106   Min.   :-0.7067  
##  1st Qu.:45.45   1st Qu.:1.4739   1st Qu.:0.2421   1st Qu.:-0.0172  
##  Median :47.17   Median :1.8915   Median :0.2935   Median : 0.0165  
##  Mean   :47.57   Mean   :2.1787   Mean   :0.2914   Mean   :-0.0219  
##  3rd Qu.:48.99   3rd Qu.:2.6570   3rd Qu.:0.3456   3rd Qu.: 0.0429  
##  Max.   :72.19   Max.   :6.7986   Max.   :0.5224   Max.   : 0.1460  
##  NA's   :15625   NA's   :15625    NA's   :15625    NA's   :15625    
##     NDVI_max       NDVI_stdDev       NDBI_mean          NDBI_min      
##  Min.   :0.3323   Min.   :0.0431   Min.   :-0.1891   Min.   :-0.8918  
##  1st Qu.:0.7022   1st Qu.:0.0994   1st Qu.:-0.0904   1st Qu.:-0.4090  
##  Median :0.7436   Median :0.1203   Median :-0.0576   Median :-0.3503  
##  Mean   :0.7334   Mean   :0.1256   Mean   :-0.0556   Mean   :-0.3618  
##  3rd Qu.:0.7842   3rd Qu.:0.1407   3rd Qu.:-0.0225   3rd Qu.:-0.3031  
##  Max.   :0.8956   Max.   :0.2645   Max.   : 0.1359   Max.   :-0.0227  
##  NA's   :15625    NA's   :15625    NA's   :15625     NA's   :15625    
##     NDBI_max       NDBI_stdDev     Mean_Albedo_mean Mean_Albedo_stdDev
##  Min.   :0.0527   Min.   :0.0422   Min.   :0.1160   Min.   :0.0155    
##  1st Qu.:0.1441   1st Qu.:0.0682   1st Qu.:0.1455   1st Qu.:0.0281    
##  Median :0.1965   Median :0.0802   Median :0.1542   Median :0.0351    
##  Mean   :0.2108   Mean   :0.0866   Mean   :0.1553   Mean   :0.0378    
##  3rd Qu.:0.2441   3rd Qu.:0.0938   3rd Qu.:0.1641   3rd Qu.:0.0434    
##  Max.   :0.6444   Max.   :0.3142   Max.   :0.2129   Max.   :0.1145    
##  NA's   :15625    NA's   :15625    NA's   :15625    NA's   :15625     
##  Low_Albedo_mean  Low_Albedo_stdDev High_Albedo_mean High_Albedo_stdDev
##  Min.   :0.1353   Min.   :0.3125    Min.   :0.0000   Min.   :0.0000    
##  1st Qu.:0.3766   1st Qu.:0.4335    1st Qu.:0.0000   1st Qu.:0.0000    
##  Median :0.5045   Median :0.4845    Median :0.0033   Median :0.0557    
##  Mean   :0.5164   Mean   :0.4565    Mean   :0.0109   Mean   :0.0674    
##  3rd Qu.:0.6337   3rd Qu.:0.4976    3rd Qu.:0.0106   3rd Qu.:0.0994    
##  Max.   :0.8967   Max.   :0.5000    Max.   :0.1378   Max.   :0.3393    
##  NA's   :15625    NA's   :15625     NA's   :15625    NA's   :15625     
##  Impervious_mean  Impervious_min  Impervious_max   Impervious_stdDev
##  Min.   : 7.385   Min.   : 0.00   Min.   : 95.00   Min.   :11.70    
##  1st Qu.:50.508   1st Qu.: 0.00   1st Qu.:100.00   1st Qu.:19.16    
##  Median :60.177   Median : 0.00   Median :100.00   Median :22.55    
##  Mean   :57.117   Mean   : 1.57   Mean   : 99.76   Mean   :23.37    
##  3rd Qu.:65.002   3rd Qu.: 1.00   3rd Qu.:100.00   3rd Qu.:26.62    
##  Max.   :84.825   Max.   :39.00   Max.   :100.00   Max.   :40.11    
##  NA's   :15625    NA's   :15625   NA's   :15625    NA's   :15625    
##  Impervious_gt70_pct
##  Min.   : 3.289     
##  1st Qu.:22.261     
##  Median :33.676     
##  Mean   :36.019     
##  3rd Qu.:48.425     
##  Max.   :86.388     
##  NA's   :15625
combined <- combined %>%
  mutate(
    Year = as.numeric(Year),
    LST_mean = as.numeric(LST_mean),
    NDVI_mean = as.numeric(NDVI_mean),
    NDBI_mean = as.numeric(NDBI_mean)
  )
combined <- combined %>%
  filter(
    !is.na(GEOID),
    !is.na(Year),
    !is.na(LST_mean),
    !is.na(NDVI_mean),
    !is.na(NDBI_mean)
  )
View(combined)

nrow(combined)
## [1] 2150
# ===============================
# lst trends
# ===============================

lst_trends <- combined %>%
  group_by(GEOID) %>%
  filter(n() >= 2) %>%
  do(tidy(lm(LST_mean ~ Year, data = .))) %>%
  filter(term == "Year") %>%
  select(GEOID, estimate, p.value) %>%
  rename(
    LST_trend_C_per_year = estimate,
    LST_pvalue = p.value
  )


# ===============================
# ndvi
# ===============================

ndvi_trends <- combined %>%
  group_by(GEOID) %>%
  filter(n() >= 2) %>%
  do(tidy(lm(NDVI_mean ~ Year, data = .))) %>%
  filter(term == "Year") %>%
  select(GEOID, estimate, p.value) %>%
  rename(
    NDVI_trend_per_year = estimate,
    NDVI_pvalue = p.value
  )


# ===============================
# tract ndbi
# ===============================

ndbi_trends <- combined %>%
  group_by(GEOID) %>%
  filter(n() >= 2) %>%
  do(tidy(lm(NDBI_mean ~ Year, data = .))) %>%
  filter(term == "Year") %>%
  select(GEOID, estimate, p.value) %>%
  rename(
    NDBI_trend_per_year = estimate,
    NDBI_pvalue = p.value
  )


#more trend results

trend_data <- lst_trends %>%
  left_join(ndvi_trends, by = "GEOID") %>%
  left_join(ndbi_trends, by = "GEOID")




static_vars <- combined %>%
  select(
    GEOID,
    Impervious_mean,
    Impervious_gt70_pct,
    Mean_Albedo_mean
  ) %>%
  distinct()

trend_data <- trend_data %>%
  left_join(static_vars, by = "GEOID")




View(trend_data)
summary(trend_data)
##     GEOID           LST_trend_C_per_year   LST_pvalue       
##  Length:86          Min.   :-0.009624    Min.   :1.000e-08  
##  Class :character   1st Qu.: 0.125617    1st Qu.:7.820e-06  
##  Mode  :character   Median : 0.143765    Median :3.636e-05  
##                     Mean   : 0.140637    Mean   :2.903e-02  
##                     3rd Qu.: 0.165664    3rd Qu.:3.912e-04  
##                     Max.   : 0.247559    Max.   :9.617e-01  
##  NDVI_trend_per_year   NDVI_pvalue        NDBI_trend_per_year 
##  Min.   :-0.0033736   Min.   :0.0000000   Min.   :-0.0062828  
##  1st Qu.:-0.0003543   1st Qu.:0.0001707   1st Qu.:-0.0003165  
##  Median : 0.0004216   Median :0.0410335   Median : 0.0006370  
##  Mean   : 0.0005680   Mean   :0.1905513   Mean   : 0.0003471  
##  3rd Qu.: 0.0012138   3rd Qu.:0.2619565   3rd Qu.: 0.0013675  
##  Max.   : 0.0072537   Max.   :0.9807874   Max.   : 0.0040963  
##   NDBI_pvalue        Impervious_mean  Impervious_gt70_pct Mean_Albedo_mean
##  Min.   :0.0000001   Min.   : 7.385   Min.   : 3.289      Min.   :0.1160  
##  1st Qu.:0.0002130   1st Qu.:50.663   1st Qu.:22.315      1st Qu.:0.1456  
##  Median :0.0065100   Median :60.177   Median :33.676      Median :0.1542  
##  Mean   :0.1268178   Mean   :57.117   Mean   :36.019      Mean   :0.1553  
##  3rd Qu.:0.1462094   3rd Qu.:64.942   3rd Qu.:48.115      3rd Qu.:0.1640  
##  Max.   :0.9217856   Max.   :84.825   Max.   :86.388      Max.   :0.2129
model_trend <- lm(
  LST_trend_C_per_year ~ NDVI_trend_per_year +
    NDBI_trend_per_year +
    Impervious_mean +
    Mean_Albedo_mean,
  data = trend_data
)

summary(model_trend)
## 
## Call:
## lm(formula = LST_trend_C_per_year ~ NDVI_trend_per_year + NDBI_trend_per_year + 
##     Impervious_mean + Mean_Albedo_mean, data = trend_data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.161060 -0.012148 -0.000411  0.013228  0.094464 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          0.1454841  0.0345392   4.212 6.52e-05 ***
## NDVI_trend_per_year -7.0118414  2.9622506  -2.367   0.0203 *  
## NDBI_trend_per_year 15.0069845  2.8441887   5.276 1.08e-06 ***
## Impervious_mean      0.0004673  0.0002602   1.796   0.0762 .  
## Mean_Albedo_mean    -0.2110468  0.1989488  -1.061   0.2919    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03033 on 81 degrees of freedom
## Multiple R-squared:  0.5452, Adjusted R-squared:  0.5227 
## F-statistic: 24.27 on 4 and 81 DF,  p-value: 3.208e-13
ggplot(trend_data,
       aes(x = NDVI_trend_per_year,
           y = LST_trend_C_per_year)) +

  geom_point(size = 3) +

  geom_smooth(method = "lm") +

  labs(
    title = "Relationship Between Vegetation Change and Warming Trends",
    x = "NDVI Trend per Year",
    y = "LST Warming Trend (°C/year)"
  ) +

  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

ggplot(trend_data,
       aes(x = NDBI_trend_per_year,
           y = LST_trend_C_per_year)) +

  geom_point(size = 3) +

  geom_smooth(method = "lm") +

  labs(
    title = "Relationship Between Built-Up Growth and Warming Trends",
    x = "NDBI Trend per Year",
    y = "LST Warming Trend (°C/year)"
  ) +

  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

write.csv(
  trend_data,
  "C:/Users/noahs/Downloads/Stockton_Tract_Trend_Data.csv",
  row.names = FALSE
)
# ===============================
# SUMMARY TABLE
# ===============================
trend_data <- trend_data %>%
  ungroup()

summary_table <- tibble(

  Metric = c(
    "Mean warming rate (°C/year)",
    "Hottest warming tract",
    "Coolest/stable tract",
    "Strongest NDVI decline",
    "Strongest urbanization growth"
  ),

  GEOID = c(
    NA,
    trend_data$GEOID[which.max(trend_data$LST_trend_C_per_year)],
    trend_data$GEOID[which.min(trend_data$LST_trend_C_per_year)],
    trend_data$GEOID[which.min(trend_data$NDVI_trend_per_year)],
    trend_data$GEOID[which.max(trend_data$NDBI_trend_per_year)]
  ),

  Value = c(
    round(mean(trend_data$LST_trend_C_per_year, na.rm = TRUE), 3),
    round(max(trend_data$LST_trend_C_per_year, na.rm = TRUE), 3),
    round(min(trend_data$LST_trend_C_per_year, na.rm = TRUE), 3),
    round(min(trend_data$NDVI_trend_per_year, na.rm = TRUE), 5),
    round(max(trend_data$NDBI_trend_per_year, na.rm = TRUE), 5)
  )
)

summary_table
## # A tibble: 5 × 3
##   Metric                        GEOID         Value
##   <chr>                         <chr>         <dbl>
## 1 Mean warming rate (°C/year)   <NA>        0.141  
## 2 Hottest warming tract         6077004001  0.248  
## 3 Coolest/stable tract          6077005131 -0.01   
## 4 Strongest NDVI decline        6077005131 -0.00337
## 5 Strongest urbanization growth 6077003900  0.0041
View(summary_table)
trend_data %>%
  filter(GEOID == "6077005131")
## # A tibble: 1 × 10
##   GEOID      LST_trend_C_per_year LST_pvalue NDVI_trend_per_year NDVI_pvalue
##   <chr>                     <dbl>      <dbl>               <dbl>       <dbl>
## 1 6077005131             -0.00962      0.871            -0.00337       0.200
## # ℹ 5 more variables: NDBI_trend_per_year <dbl>, NDBI_pvalue <dbl>,
## #   Impervious_mean <dbl>, Impervious_gt70_pct <dbl>, Mean_Albedo_mean <dbl>
trend_data %>%
  filter(GEOID %in% c("6077005131", "6077004001"))
## # A tibble: 2 × 10
##   GEOID      LST_trend_C_per_year  LST_pvalue NDVI_trend_per_year NDVI_pvalue
##   <chr>                     <dbl>       <dbl>               <dbl>       <dbl>
## 1 6077004001              0.248   0.000000203            -0.00287      0.0320
## 2 6077005131             -0.00962 0.871                  -0.00337      0.200 
## # ℹ 5 more variables: NDBI_trend_per_year <dbl>, NDBI_pvalue <dbl>,
## #   Impervious_mean <dbl>, Impervious_gt70_pct <dbl>, Mean_Albedo_mean <dbl>
combined %>%
  filter(GEOID == "6077005131") %>%
  select(GEOID, Year, LST_mean, NDVI_mean, NDBI_mean, Impervious_mean, Mean_Albedo_mean)
##         GEOID Year LST_mean NDVI_mean    NDBI_mean Impervious_mean
## 1  6077005131 2000 41.57566 0.2857524  0.028485955        32.20152
## 2  6077005131 2001 40.11028 0.3325515 -0.048798242        32.20152
## 3  6077005131 2002 45.50677 0.1430266  0.129636522        32.20152
## 4  6077005131 2003 44.94672 0.1595059  0.123558253        32.20152
## 5  6077005131 2004 42.46034 0.2650727  0.050978434        32.20152
## 6  6077005131 2005 43.36195 0.1487664  0.080743565        32.20152
## 7  6077005131 2006 40.99447 0.3479116 -0.098170057        32.20152
## 8  6077005131 2007 43.28224 0.3215936 -0.063044798        32.20152
## 9  6077005131 2008 42.15297 0.3023290 -0.049647756        32.20152
## 10 6077005131 2009 44.42965 0.1732279  0.054982252        32.20152
## 11 6077005131 2010 38.85906 0.3645276 -0.084786271        32.20152
## 12 6077005131 2011 39.44566 0.4093032 -0.097805057        32.20152
## 13 6077005131 2012 40.56538 0.3909162 -0.106196724        32.20152
## 14 6077005131 2013 40.16792 0.3833839 -0.113871564        32.20152
## 15 6077005131 2014 44.78527 0.2662693  0.085876847        32.20152
## 16 6077005131 2015 42.29623 0.3878253 -0.062753319        32.20152
## 17 6077005131 2016 44.72480 0.2563138  0.028031575        32.20152
## 18 6077005131 2017 45.79435 0.1640057  0.028522576        32.20152
## 19 6077005131 2018 41.48453 0.2293384  0.022036547        32.20152
## 20 6077005131 2019 43.01243 0.2279054  0.026252708        32.20152
## 21 6077005131 2020 41.08406 0.2673742  0.002883495        32.20152
## 22 6077005131 2021 40.68962 0.2256639  0.033492568        32.20152
## 23 6077005131 2022 45.64754 0.1625146  0.101341212        32.20152
## 24 6077005131 2023 40.34417 0.1157667  0.062085237        32.20152
## 25 6077005131 2024 41.85206 0.1106191  0.043385679        32.20152
##    Mean_Albedo_mean
## 1         0.2099207
## 2         0.2099207
## 3         0.2099207
## 4         0.2099207
## 5         0.2099207
## 6         0.2099207
## 7         0.2099207
## 8         0.2099207
## 9         0.2099207
## 10        0.2099207
## 11        0.2099207
## 12        0.2099207
## 13        0.2099207
## 14        0.2099207
## 15        0.2099207
## 16        0.2099207
## 17        0.2099207
## 18        0.2099207
## 19        0.2099207
## 20        0.2099207
## 21        0.2099207
## 22        0.2099207
## 23        0.2099207
## 24        0.2099207
## 25        0.2099207
combined %>%
  filter(GEOID == "6077004001") %>%
  select(
    GEOID, Year,
    LST_mean, NDVI_mean, NDBI_mean,
    Impervious_mean, Mean_Albedo_mean
  )
##         GEOID Year LST_mean NDVI_mean    NDBI_mean Impervious_mean
## 1  6077004001 2000 36.81176 0.4114576 -0.012524094         18.9265
## 2  6077004001 2001 34.25643 0.4303365 -0.064197009         18.9265
## 3  6077004001 2002 35.66781 0.4525504 -0.098608461         18.9265
## 4  6077004001 2003 36.70503 0.4157240 -0.056660309         18.9265
## 5  6077004001 2004 35.58914 0.4251595 -0.067963874         18.9265
## 6  6077004001 2005 38.05745 0.4655573 -0.119077672         18.9265
## 7  6077004001 2006 37.70322 0.4255330 -0.078765290         18.9265
## 8  6077004001 2007 37.20348 0.4700533 -0.126837545         18.9265
## 9  6077004001 2008 38.10348 0.4380476 -0.103046932         18.9265
## 10 6077004001 2009 37.84722 0.4549672 -0.105494528         18.9265
## 11 6077004001 2010 35.04262 0.4354681 -0.084174507         18.9265
## 12 6077004001 2011 36.65878 0.3582103 -0.004641316         18.9265
## 13 6077004001 2012 36.17240 0.4450963 -0.103381255         18.9265
## 14 6077004001 2013 38.45573 0.4247663 -0.035767313         18.9265
## 15 6077004001 2014 39.23629 0.4281518 -0.069253853         18.9265
## 16 6077004001 2015 39.57914 0.4614746 -0.090555453         18.9265
## 17 6077004001 2016 39.89467 0.4443671 -0.083519427         18.9265
## 18 6077004001 2017 40.86468 0.3411755  0.030338563         18.9265
## 19 6077004001 2018 38.24105 0.4293277 -0.067464034         18.9265
## 20 6077004001 2019 39.73734 0.4735258 -0.099903483         18.9265
## 21 6077004001 2020 38.91668 0.4321625 -0.071899715         18.9265
## 22 6077004001 2021 40.96707 0.2546313  0.120896346         18.9265
## 23 6077004001 2022 42.40660 0.3714087 -0.007990537         18.9265
## 24 6077004001 2023 40.26210 0.3936746 -0.031470510         18.9265
## 25 6077004001 2024 42.44184 0.3566464  0.024609937         18.9265
##    Mean_Albedo_mean
## 1         0.1690905
## 2         0.1690905
## 3         0.1690905
## 4         0.1690905
## 5         0.1690905
## 6         0.1690905
## 7         0.1690905
## 8         0.1690905
## 9         0.1690905
## 10        0.1690905
## 11        0.1690905
## 12        0.1690905
## 13        0.1690905
## 14        0.1690905
## 15        0.1690905
## 16        0.1690905
## 17        0.1690905
## 18        0.1690905
## 19        0.1690905
## 20        0.1690905
## 21        0.1690905
## 22        0.1690905
## 23        0.1690905
## 24        0.1690905
## 25        0.1690905
combined %>%
  filter(GEOID == "6077005131") %>%
  ggplot(aes(x = Year, y = LST_mean)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2) +
  labs(
    title = "LST Trend for Census Tract 6077004001",
    x = "Year",
    y = "Mean Summer LST (°C)"
  ) +
  theme_minimal()

library(patchwork)
## Warning: package 'patchwork' was built under R version 4.5.3
base_theme <- theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(size = 12, face = "bold", hjust = 0),
    axis.title = element_text(size = 10),
    axis.text = element_text(size = 9),
    panel.grid.minor = element_blank(),
    plot.margin = margin(5, 8, 5, 8)
  )

p1 <- ggplot(trend_data,
             aes(x = NDVI_trend_per_year,
                 y = LST_trend_C_per_year)) +

  geom_point(color = "black", size = 1.7, alpha = 0.8) +

  geom_smooth(method = "lm",
              se = TRUE,
              linewidth = 0.8) +

  labs(
    title = "(A) NDVI trend vs. LST warming trend",
    x = "NDVI trend (year⁻¹)",
    y = "LST warming trend (°C year⁻¹)"
  ) +

  base_theme

p2 <- ggplot(trend_data,
             aes(x = NDBI_trend_per_year,
                 y = LST_trend_C_per_year)) +

  geom_point(color = "black", size = 1.7, alpha = 0.8) +

  geom_smooth(method = "lm",
              se = TRUE,
              linewidth = 0.8) +

  labs(
    title = "(B) NDBI trend vs. LST warming trend",
    x = "NDBI trend (year⁻¹)",
    y = "LST warming trend (°C year⁻¹)"
  ) +

  base_theme

fig2 <- p1 / p2 +
  plot_annotation(
    title = "Relationships between land-cover trends and summer LST warming trends",
    theme = theme(
      plot.title = element_text(size = 13,
                                face = "bold",
                                hjust = 0.5)
    )
  )

fig2
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'