Abstract

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.

Background

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.

Research Question and Hypothesis

Methods and Data

Results

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

Interpretation

References

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