As the market for electric vehicles (EV) continues to grow, many cities in the US are planning on expanding their existing EV charging infrastructure to accommodate future increases in ownership, while ensuring equitable access for socially vulnerable communities. Using the Bexar County region as an area of study, I utilize a local Moran’s I and spatial autoregression (SAR) lag model that leverages data from the National Renewable Energy Lab (NREL), Department of Energy (DOE) and American Community Survey (ACS) to explore existing inequitable charging station access in Bexar County. As a result, I affirm assumptions that inequitable charging infrastructure is present, with affluent communities having better access.
The government’s decision to offer more incentives for owning an EV has resulted in the availability of affordable new and used EVs. This has given vulnerable households the chance to own one. However, these communities may have to rely more on public charging options, as they may not be able to afford home charging options [1]. Unfortunately, in many major cities across the US, access to adequate charging infrastructure for EVs is limited, making it difficult for these vulnerable communities to charge their vehicles or even consider EV adoption.
The level of Income and amount of minority populations intersect with increased energy burden, which cause greater need for publicly available EV charging stations. With less equitable distribution of EV charging infrastructure this will lead to lower access for these individuals which will lead to a less chance for EV adoption within these communities.
RQ: Is there inequitable access to EV charging
stations for vulnerable communities in Bexar County?
H0 (NULL): There are no spatial clustering of census
tracts with higher vulnerability indices and access to EVCS.
H1 (NULL) : Socio-economic factors do not affect
accessibility to EVCS.
Unit of Analysis: Census tracts with or without
EVCS
Data:
Number of EVCS and Distance to EV charging stations will based on point data gathered from NREL.
Socio-economic data at the tract level which includes median household income, percent of Hispanic population , percent of white-non-Hispanic population , percent of African American/Black population , Monthly Energy Cost , means of transportation to work (car, truck or van) , and commute time to work will be collected from ACS 2022 1 year estimate.
Method:
A Local Moran’s I will be used to detect spatial clustering of tracts that have higher or lower EV charging station access and vulnerability indices.
Spatial Autoregressive Model (SAR) Lag Model will be used to detect if socio-economic factors are correlated with access to EVCS.
# Local Moran's I Models
# Nearest EVCS Distance in Meters ----
# Calculated by determining distance in meters of the centroid of tracts to the nearest EVCS point
bexar2_data<-qs::qread(file = "../Final Project/data/acs22_evcs_tract.qs")
table(st_is_valid(bexar2_data))
##
## TRUE
## 375
#bexar_data <- bexar_data[!is.na(bexar_data$nearest_ev_distance), ] #Removes NAs
length(bexar2_data$nearest_ev_distance)
## [1] 375
nrow(bexar2_data)
## [1] 375
#mapview(bexar2_data, zcol="nearest_ev_distance")
bexar2_data<-as_Spatial(bexar2_data) # sf -> sp
# bexar_data <- as(bexar_data,'sf') sp -> sf
bexar2_data@data$nearest_ev_distance[is.na(bexar2_data@data$nearest_ev_distance)]<-0
# Define neighbors
nbs<-poly2nb(bexar2_data,queen = T)
w_bexar2<-nb2listw(nbs,style = "W") #Neighbor W matrix
locM<-localmoran(x = bexar2_data$nearest_ev_distance,listw = w_bexar2)
#summary(locM)
# Lag + Mean of nearest_ev_distance and lag
bexar2_data@data$nearest_ev_distance_lag<-lag.listw(w_bexar2,bexar2_data@data$nearest_ev_distance)
mean_nearest_ev_distance<-mean(bexar2_data@data$nearest_ev_distance) # mean of variable and mean of lag
mean_nearest_ev_distance_lag<-mean(bexar2_data@data$nearest_ev_distance_lag)
# Tagging for plot
bexar2_data@data$quad_sig <- 5 # not significant
bexar2_data@data[(bexar2_data@data$nearest_ev_distance >= mean_nearest_ev_distance & bexar2_data@data$nearest_ev_distance_lag >= mean_nearest_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 1 # High-High
bexar2_data@data[(bexar2_data@data$nearest_ev_distance <= mean_nearest_ev_distance & bexar2_data@data$nearest_ev_distance_lag <= mean_nearest_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 2 # Low-Low
bexar2_data@data[(bexar2_data@data$nearest_ev_distance >= mean_nearest_ev_distance & bexar2_data@data$nearest_ev_distance_lag <= mean_nearest_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 3 # High-Low
bexar2_data@data[(bexar2_data@data$nearest_ev_distance >= mean_nearest_ev_distance & bexar2_data@data$nearest_ev_distance_lag <= mean_nearest_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 4 # Low-High
breaks <- seq(1, 5, 1)
labels <- c("High-High", "Low-Low", "High-Low", "Low-High", "Not Signif.")
np <- findInterval(bexar2_data$quad_sig, breaks)
## GGPLOT
bexar2_sf <- st_as_sf(bexar2_data)
# Convert sf to data.frame
bexar2_df <- as.data.frame(bexar2_sf)
# Create a column for colors based on quad_sig
bexar2_df$colors <- ifelse(bexar2_df$quad_sig == 1, "red",
ifelse(bexar2_df$quad_sig == 2, "blue",
ifelse(bexar2_df$quad_sig == 3, "lightpink",
ifelse(bexar2_df$quad_sig == 4, "skyblue2", "white"))))
# Convert back to sf
bexar2_sf <- st_as_sf(bexar2_df)
ggplot() +
geom_sf(data = bexar2_sf, aes(fill = colors, geometry = geometry)) +
scale_fill_identity()+
labs(title = "Distance to Nearest EVCS") +
theme_void() +
theme(legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10)) +
guides(fill = guide_legend(title.position = "top", title.vjust = 0.5))
# Average EV Distance ----
bexar2_1_data<-qs::qread(file = "../Final Project/data/acs22_evcs_tract.qs")
table(st_is_valid(bexar2_1_data))
##
## TRUE
## 375
# bexar3_data <- bexar_data[!is.na(bexar_data$med_income), ] #Removes NAs
length(bexar2_1_data$avg_ev_distance)
## [1] 375
nrow(bexar2_1_data)
## [1] 375
bexar2_1_data<-as_Spatial(bexar2_1_data) # sf -> sp
# bexar3_data <- as(bexar3_data,'sf') sp -> sf
bexar2_1_data@data$avg_ev_distance[is.na(bexar2_1_data@data$avg_ev_distance)]<-0
# Define neighbors
nbs<-poly2nb(bexar2_1_data,queen = T)
w_bexar2_1<-nb2listw(nbs,style = "W") #Neighbor W matrix
locM<-localmoran(x = bexar2_1_data$avg_ev_distance,listw = w_bexar2_1)
#summary(locM)
# Lag + Mean of energy_burden and lag
bexar2_1_data@data$avg_ev_distance_lag<-lag.listw(w_bexar2_1,bexar2_1_data@data$avg_ev_distance)
mean_ev_distance<-mean(bexar2_1_data@data$avg_ev_distance) # mean of variable and mean of lag
mean_ev_distance_lag<-mean(bexar2_1_data@data$avg_ev_distance_lag)
# Tagging for plot
bexar2_1_data@data$quad_sig <- 5 # not significant
bexar2_1_data@data[(bexar2_1_data@data$avg_ev_distance >= mean_ev_distance & bexar2_1_data@data$avg_ev_distance_lag >= mean_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 1 # High-High
bexar2_1_data@data[(bexar2_1_data@data$avg_ev_distance <= mean_ev_distance & bexar2_1_data@data$avg_ev_distance_lag <= mean_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 2 # Low-Low
bexar2_1_data@data[(bexar2_1_data@data$avg_ev_distance >= mean_ev_distance & bexar2_1_data@data$avg_ev_distance_lag <= mean_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 3 # High-Low
bexar2_1_data@data[(bexar2_1_data@data$avg_ev_distance >= mean_ev_distance & bexar2_1_data@data$avg_ev_distance_lag <= mean_ev_distance_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 4 # Low-High
breaks <- seq(1, 5, 1)
labels <- c("High-High", "Low-Low", "High-Low", "Low-High", "Not Signif.")
## GGPLOT
bexar2_1_data_sf <- st_as_sf(bexar2_1_data)
# Convert sf to data.frame
bexar2_1_data_df <- as.data.frame(bexar2_1_data_sf)
# Create a column for colors based on quad_sig
bexar2_1_data_df$colors <- ifelse(bexar2_1_data_df$quad_sig == 1, "red",
ifelse(bexar2_1_data_df$quad_sig == 2, "blue",
ifelse(bexar2_1_data_df$quad_sig == 3, "lightpink",
ifelse(bexar2_1_data_df$quad_sig == 4, "skyblue2", "white"))))
# Convert back to sf
bexar2_1_data_sf <- st_as_sf(bexar2_1_data_df)
# Plot with ggplot
ggplot() +
geom_sf(data = bexar2_1_data_sf, aes(fill = colors)) +
scale_fill_identity()+
labs(title = "Average EV Distance") +
theme_void() +
theme(legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10)) +
guides(fill = guide_legend(title.position = "top", title.vjust = 0.5))
# White Population ----
wbexar_data<-qs::qread(file = "../Final Project/data/acs22_evcs_tract.qs")
wbexar_data<-as_Spatial(wbexar_data) # sf -> sp
# bexar_data <- as(bexar_data,'sf') sp -> sf
wbexar_data@data$pct_white[is.na(wbexar_data@data$pct_white)]<-0
# Define neighbors
nbs<-poly2nb(wbexar_data,queen = T)
w_bexar<-nb2listw(nbs,style = "W") #Neighbor W matrix
locM<-localmoran(x = wbexar_data$pct_white,listw = w_bexar)
summary(locM)
## Ii E.Ii Var.Ii Z.Ii
## Min. :-2.0234 Min. :-0.0273448 Min. :0.00000 Min. :-3.5376
## 1st Qu.: 0.0471 1st Qu.:-0.0036148 1st Qu.:0.02450 1st Qu.: 0.4654
## Median : 0.4049 Median :-0.0015012 Median :0.08906 Median : 1.5342
## Mean : 0.6515 Mean :-0.0026738 Mean :0.17838 Mean : 1.4299
## 3rd Qu.: 1.0416 3rd Qu.:-0.0004466 3rd Qu.:0.21195 3rd Qu.: 2.4753
## Max. : 4.9389 Max. : 0.0000000 Max. :2.47342 Max. : 5.7246
## Pr(z != E(Ii))
## Min. :0.00000
## 1st Qu.:0.01261
## Median :0.10587
## Mean :0.25015
## 3rd Qu.:0.45069
## Max. :0.98507
# Lag + Mean of variable and lag
wbexar_data@data$pct_white_lag<-lag.listw(w_bexar,wbexar_data@data$pct_white)
mean_pct_white<-mean(wbexar_data@data$pct_white) # mean of variable and mean of lag
mean_pct_white_lag<-mean(wbexar_data@data$pct_white_lag)
# Tagging for plot
wbexar_data@data$quad_sig <- 5 # not significant
wbexar_data@data[(wbexar_data@data$pct_white >= mean_pct_white & wbexar_data@data$pct_white_lag >= mean_pct_white_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 1 # High-High
wbexar_data@data[(wbexar_data@data$pct_white <= mean_pct_white & wbexar_data@data$pct_white_lag <= mean_pct_white_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 2 # Low-Low
wbexar_data@data[(wbexar_data@data$pct_white >= mean_pct_white & wbexar_data@data$pct_white_lag <= mean_pct_white_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 3 # High-Low
wbexar_data@data[(wbexar_data@data$pct_white >= mean_pct_white & wbexar_data@data$pct_white_lag <= mean_pct_white_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 4 # Low-High
breaks <- seq(1, 5, 1)
labels <- c("High-High", "Low-Low", "High-Low", "Low-High", "Not Signif.")
np <- findInterval(wbexar_data$quad_sig, breaks)
wbexar_sf <- st_as_sf(wbexar_data)
# Convert sf to data.frame
wbexar_df <- as.data.frame(wbexar_sf)
# Create a column for colors based on quad_sig
wbexar_df$colors <- ifelse(wbexar_df$quad_sig == 1, "red",
ifelse(wbexar_df$quad_sig == 2, "blue",
ifelse(wbexar_df$quad_sig == 3, "lightpink",
ifelse(wbexar_df$quad_sig == 4, "skyblue2", "white"))))
# Convert back to sf
wbexar_sf <- st_as_sf(wbexar_df)
ggplot() +
geom_sf(data = wbexar_sf, aes(fill = colors), show.legend = FALSE) +
scale_fill_identity() +
labs(title = "Percent White Population") +
theme_void() +
theme(legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10)) +
guides(fill = guide_legend(title.position = "top", title.vjust = 0.5))
# Median Income ----
table(st_is_valid(bexar_data))
##
## TRUE
## 375
# bexar_data <- bexar_data[!is.na(bexar_data$med_income), ] #Removes NAs
length(bexar_data$med_income)
## [1] 375
nrow(bexar_data)
## [1] 375
library(spdep)
bexar1_data<-as_Spatial(bexar_data) # sf -> sp
# bexar_data <- as(bexar_data,'sf') sp -> sf
bexar1_data@data$med_income[is.na(bexar1_data@data$med_income)]<-0
# Define neighbors
nbs<-poly2nb(bexar1_data,queen = T)
w_bexar<-nb2listw(nbs,style = "W") #Neighbor W matrix
locM<-localmoran(x = bexar1_data$med_income,listw = w_bexar)
summary(locM)
## Ii E.Ii Var.Ii Z.Ii
## Min. :-3.02033 Min. :-0.0735168 Min. :0.00000 Min. :-4.9819
## 1st Qu.: 0.04224 1st Qu.:-0.0026014 1st Qu.:0.01524 1st Qu.: 0.4152
## Median : 0.27039 Median :-0.0009977 Median :0.05823 Median : 1.3190
## Mean : 0.46283 Mean :-0.0026738 Mean :0.18031 Mean : 1.1654
## 3rd Qu.: 0.64107 3rd Qu.:-0.0002643 3rd Qu.:0.15816 3rd Qu.: 1.9713
## Max. : 4.27461 Max. : 0.0000000 Max. :5.12427 Max. : 4.7328
## Pr(z != E(Ii))
## Min. :0.0000006
## 1st Qu.:0.0433784
## Median :0.1641854
## Mean :0.2884452
## 3rd Qu.:0.4726262
## Max. :0.9989945
# Lag + Mean of variable and lag
bexar1_data@data$med_income_lag<-lag.listw(w_bexar,bexar1_data@data$med_income)
mean_med_income<-mean(bexar1_data@data$med_income) # mean of variable and mean of lag
mean_income_lag<-mean(bexar1_data@data$med_income_lag)
# Tagging for plot
bexar1_data@data$quad_sig <- 5 # not significant
bexar1_data@data[(bexar1_data@data$med_income >= mean_med_income & bexar1_data@data$med_income_lag >= mean_income_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 1 # High-High
bexar1_data@data[(bexar1_data@data$med_income <= mean_med_income & bexar1_data@data$med_income_lag <= mean_income_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 2 # Low-Low
bexar1_data@data[(bexar1_data@data$med_income >= mean_med_income & bexar1_data@data$med_income_lag <= mean_income_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 3 # High-Low
bexar1_data@data[(bexar1_data@data$med_income >= mean_med_income & bexar1_data@data$med_income_lag <= mean_income_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 4 # Low-High
breaks <- seq(1, 5, 1)
labels <- c("High-High", "Low-Low", "High-Low", "Low-High", "Not Signif.")
np <- findInterval(bexar1_data$quad_sig, breaks)
bexar_sf <- st_as_sf(bexar1_data)
# Convert sf to data.frame
bexar_df <- as.data.frame(bexar_sf)
# Create a column for colors based on quad_sig
bexar_df$colors <- ifelse(bexar_df$quad_sig == 1, "red",
ifelse(bexar_df$quad_sig == 2, "blue",
ifelse(bexar_df$quad_sig == 3, "lightpink",
ifelse(bexar_df$quad_sig == 4, "skyblue2", "white"))))
# Convert back to sf
bexar_sf <- st_as_sf(bexar_df)
ggplot() +
geom_sf(data = bexar_sf, aes(fill = colors), show.legend = FALSE) +
scale_fill_identity() +
labs(title = "Median Income") +
theme_void() +
theme(legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10)) +
guides(fill = guide_legend(title.position = "top", title.vjust = 0.5))
# Energy Burden ----
bexar3_data<-qs::qread(file = "../Final Project/data/acs22_evcs_tract.qs")
table(st_is_valid(bexar3_data))
##
## TRUE
## 375
# bexar3_data <- bexar_data[!is.na(bexar_data$med_income), ] #Removes NAs
length(bexar3_data$energy_burden)
## [1] 375
nrow(bexar3_data)
## [1] 375
bexar3_data<-as_Spatial(bexar3_data) # sf -> sp
# bexar3_data <- as(bexar3_data,'sf') sp -> sf
bexar3_data@data$energy_burden[is.na(bexar3_data@data$energy_burden)]<-0
# Define neighbors
nbs<-poly2nb(bexar3_data,queen = T)
w_bexar3<-nb2listw(nbs,style = "W") #Neighbor W matrix
locM<-localmoran(x = bexar3_data$energy_burden,listw = w_bexar3)
summary(locM)
## Ii E.Ii Var.Ii Z.Ii
## Min. :-2.57402 Min. :-4.306e-02 Min. :0.000089 Min. :-4.2391
## 1st Qu.: 0.01068 1st Qu.:-1.881e-03 1st Qu.:0.000181 1st Qu.: 0.4661
## Median : 0.47754 Median :-1.881e-03 Median :0.098981 Median : 1.5267
## Mean : 0.58430 Mean :-2.674e-03 Mean :0.168358 Mean : 1.3053
## 3rd Qu.: 0.70364 3rd Qu.:-2.440e-06 3rd Qu.:0.139329 3rd Qu.: 2.0930
## Max. : 7.67689 Max. :-2.440e-06 Max. :3.831974 Max. : 6.0043
## Pr(z != E(Ii))
## Min. :0.00000
## 1st Qu.:0.02618
## Median :0.10384
## Mean :0.24246
## 3rd Qu.:0.42709
## Max. :0.95501
# Lag + Mean of energy_burden and lag
bexar3_data@data$energy_burden_lag<-lag.listw(w_bexar3,bexar3_data@data$energy_burden)
mean_energy_burden<-mean(bexar3_data@data$energy_burden) # mean of variable and mean of lag
mean_energy_burden_lag<-mean(bexar3_data@data$energy_burden_lag)
# Tagging for plot
bexar3_data@data$quad_sig <- 5 # not significant
bexar3_data@data[(bexar3_data@data$energy_burden >= mean_energy_burden & bexar3_data@data$energy_burden_lag >= mean_energy_burden_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 1 # High-High
bexar3_data@data[(bexar3_data@data$energy_burden <= mean_energy_burden & bexar3_data@data$energy_burden_lag <= mean_energy_burden_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 2 # Low-Low
bexar3_data@data[(bexar3_data@data$energy_burden >= mean_energy_burden & bexar3_data@data$energy_burden_lag <= mean_energy_burden_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 3 # High-Low
bexar3_data@data[(bexar3_data@data$energy_burden >= mean_energy_burden & bexar3_data@data$energy_burden_lag <= mean_energy_burden_lag) & (locM[, 5] <= 0.1), "quad_sig"] <- 4 # Low-High
breaks <- seq(1, 5, 1)
labels <- c("High-High", "Low-Low", "High-Low", "Low-High", "Not Signif.")
#np <- findInterval(bexar3_data$quad_sig, breaks)
## GGPLOT
bexar3_sf <- st_as_sf(bexar3_data)
# Convert sf to data.frame
bexar3_df <- as.data.frame(bexar3_sf)
# Create a column for colors based on quad_sig
bexar3_df$colors <- ifelse(bexar3_df$quad_sig == 1, "red",
ifelse(bexar3_df$quad_sig == 2, "blue",
ifelse(bexar3_df$quad_sig == 3, "lightpink",
ifelse(bexar3_df$quad_sig == 4, "skyblue2", "white"))))
# Convert back to sf
bexar3_sf <- st_as_sf(bexar3_df)
# Plot with ggplot
ggplot() +
geom_sf(data = bexar3_sf, aes(fill = colors)) +
scale_fill_identity()+
labs(title = "Energy Burden") +
theme_void() +
theme(legend.position = "top",
legend.title = element_text(size = 12),
legend.text = element_text(size = 10)) +
guides(fill = guide_legend(title.position = "top", title.vjust = 0.5))
# SAR Model ----
bexar_sar_data<-qread(file = "../Final Project/data/acs22_evcs_tract.qs")
bexar_sar_data<-as_Spatial(bexar_sar_data)
nbs<-poly2nb(bexar_sar_data,queen = T)
w_bexar<-nb2listw(nbs,style = "W") #Neighbor W matrix
# Formula
f1<-formula(nearest_ev_distance ~ med_income + energy_burden + total_tt_work + mot_work_ctv + pct_white + pct_hisp + pct_black)
# Lag model
bexar_m1_sar<-lagsarlm(formula = f1,data = bexar_sar_data,listw = w_bexar,zero.policy = T, Durbin = T)
## Warning in subset.nb(x = nb, subset = subset): subsetting caused increase in
## subgraph count
## Warning in lagsarlm(formula = f1, data = bexar_sar_data, listw = w_bexar, : inversion of asymptotic covariance matrix failed for tol.solve = 2.22044604925031e-16
## reciprocal condition number = 2.8765e-17 - using numerical Hessian.
summary(bexar_m1_sar)
##
## Call:lagsarlm(formula = f1, data = bexar_sar_data, listw = w_bexar,
## Durbin = T, zero.policy = T)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4243.445 -612.906 -83.965 510.247 7786.167
##
## Type: mixed
## Regions with no neighbours included:
## 99
## Coefficients: (numerical Hessian approximate standard errors)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.3773e+03 1.6397e+03 0.8399 0.4009399
## med_income 1.6155e-03 3.3356e-03 0.4843 0.6281659
## energy_burden 1.2670e+02 9.5994e+01 1.3199 0.1868665
## total_tt_work 6.2064e-02 2.4026e-01 0.2583 0.7961612
## mot_work_ctv -8.3907e-02 2.5392e-01 -0.3304 0.7410608
## pct_white 5.3994e+01 1.5858e+01 3.4047 0.0006623
## pct_hisp 2.7111e+01 1.4590e+01 1.8582 0.0631351
## pct_black -3.5287e+00 1.6995e+01 -0.2076 0.8355180
## lag.med_income 5.7164e-03 6.5550e-03 0.8721 0.3831732
## lag.energy_burden -7.1443e+01 1.8149e+02 -0.3936 0.6938462
## lag.total_tt_work -2.1679e+00 9.8164e-01 -2.2085 0.0272108
## lag.mot_work_ctv 2.1266e+00 9.8896e-01 2.1504 0.0315266
## lag.pct_white -7.1480e+01 1.7085e+01 -4.1837 2.868e-05
## lag.pct_hisp -3.8226e+01 1.4941e+01 -2.5584 0.0105145
## lag.pct_black -3.4176e+01 2.4938e+01 -1.3704 0.1705484
##
## Rho: 0.90286, LR test value: 335.52, p-value: < 2.22e-16
## Approximate (numerical Hessian) standard error: 0.025899
## z-value: 34.861, p-value: < 2.22e-16
## Wald statistic: 1215.3, p-value: < 2.22e-16
##
## Log likelihood: -2816.463 for mixed model
## ML residual variance (sigma squared): 1308400, (sigma: 1143.8)
## Number of observations: 328
## Number of parameters estimated: 17
## AIC: 5666.9, (AIC for lm: 6000.4)
1: Loni, A., & Asadi, S. (2023). Data-driven equitable placement for electric vehicle charging stations: Case study San Francisco. Energy, 282, 128796. https://doi.org/10.1016/j.energy.2023.128796