#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'
