# Librerías necesarias
library(readxl)
library(spdep)
## Loading required package: spData
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
## Loading required package: sf
## Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
library(sf)
library(tmap)
library(spgwr)
## Loading required package: sp
## NOTE: This package does not constitute approval of GWR
## as a method of spatial analysis; see example(gwr)
## Loading required package: Matrix
##
## Attaching package: 'spatialreg'
## The following objects are masked from 'package:spdep':
##
## get.ClusterOption, get.coresOption, get.mcOption,
## get.VerboseOption, get.ZeroPolicyOption, set.ClusterOption,
## set.coresOption, set.mcOption, set.VerboseOption,
## set.ZeroPolicyOption
library(ggplot2)
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
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(readr)
library(foreign)
library(dplyr)
library(spdep)
library(tigris)
## To enable caching of data, set `options(tigris_use_cache = TRUE)`
## in your R script or .Rprofile.
## Loading required package: digest
##
## Attaching package: 'rgeoda'
## The following object is masked from 'package:spdep':
##
## skater
library(RColorBrewer)
library(viridis)
## Loading required package: viridisLite
library(ggplot2)
library(tmap)
library(sf)
library(sp)
library(spatialreg)
library(stargazer)
##
## Please cite as:
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
Inicio
1) Describir 3 – 5 diferencias entre la estimación de un modelo de
regression global (no especial, SAR, SEM, SDM, y/o SARAR) y un modelo de
regresión local (GWR).
- Región constante vs variable: Los modelos globales suponen efectos
constantes en todo el espacio, mientras que los locales (como GWR)
permiten que los coeficientes varíen espacialmente.
- Captura de heterogeneidad espacial: GWR permite identificar patrones
espaciales más precisos.
- Interpretación más detallada: Los modelos locales permiten análisis
más detallados por región.
- Complejidad computacional: GWR es más costoso
computacionalmente.
- Diagnóstico de autocorrelación: Los modelos locales ayudan a reducir
la autocorrelación en residuos no explicada por modelos globales.
file_path<- "/Users/marianaaleal/Desktop/TEC 2025/_Planeación estratégica basada en analítica prescriptiva /M1/tourism_state_data.xlsx"
df <- read_excel("/Users/marianaaleal/Desktop/TEC 2025/_Planeación estratégica basada en analítica prescriptiva /M1/tourism_state_data.xlsx")
## New names:
## • `region` -> `region...17`
## • `region` -> `region...18`
statesmx <- st_read("/Users/marianaaleal/Desktop/TEC 2025/_Planeación estratégica basada en analítica prescriptiva /M1/mx_shapefiles/states/mexlatlong.shp")
## Reading layer `mexlatlong' from data source
## `/Users/marianaaleal/Desktop/TEC 2025/_Planeación estratégica basada en analítica prescriptiva /M1/mx_shapefiles/states/mexlatlong.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 32 features and 19 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -118.4042 ymin: 14.55055 xmax: -86.73862 ymax: 32.71846
## Geodetic CRS: WGS 84
2) Calcular 2 matrices de conectividad que incluya uno de los
siguientes criterios: contiguedad (queen, rook, bishop), vecino más
próximo (k nearest neighbor), y/o distancia.
# Cargar shapefile de México (previamente importado como objeto sf)
names(df)[names(df) == "state_id"] <- "OBJECTID"
# Unir los datos con la geometría
data_sf <- merge(statesmx, df, by = "OBJECTID")
library(sp)
turismo.tr <- as(data_sf, "Spatial") # Conversión correcta
turismo_nb<-poly2nb(turismo.tr)
#Crear matriz de pesos espaciales (contigüidad Queen)
queen1 <- poly2nb(data_sf, queen = TRUE) ### queen approach
queen2 <- poly2nb(data_sf, queen = FALSE) ### rook approach
centroides<-coordinates(turismo.tr)
mapa.linkW<-nb2listw(turismo_nb, style="W")
plot(turismo.tr,border="blue",axes=FALSE,las=1, main="Matriz de Conectividad - Turismo MX")
plot(turismo.tr,col="grey",border=grey(0.9),axes=T,add=T)
plot(mapa.linkW,coords=centroides,pch=19,cex=0.1,col="red",add=T)

queen1 <- poly2nb(turismo.tr, queen = TRUE) ### queen approach
queen2 <- poly2nb(turismo.tr, queen = FALSE) ### rook approach
queenr <- nb2listw(queen1, style = "W", zero.policy = TRUE)
rook <- nb2listw(queen2, style = "W", zero.policy = TRUE)
plot(turismo.tr,border="blue",axes=FALSE,las=1, main="Matriz Espacial de Conexión - Queen")
plot(turismo.tr,col="grey",border=grey(0.9),axes=T,add=T)
plot(queenr,centroides, add=TRUE, col='blue')

plot(turismo.tr,border="blue",axes=FALSE,las=1, main="Matriz Espacial de Conexión - Rook")
plot(turismo.tr,col="grey",border=grey(0.9),axes=T,add=T)
plot(rook,centroides, add=TRUE, col='dark green')

3) Especificar y estimar 1 modelo de regresión global no
espacial.
# Une por nombre del estado
df_mapa <- merge(statesmx, df, by.x = "ADMIN_NAME", by.y = "state")
# Asegurarse de que no hay NAs
df_mapa <- df_mapa %>%
filter(!is.na(tourism_gdp) & !is.na(college_education) &
!is.na(real_wage) & !is.na(ratio_public_investment))
# Ahora genera vecinos desde df_mapa
vecinos <- poly2nb(df_mapa)
pesos <- nb2listw(vecinos, style = "W", zero.policy = TRUE)
modelo_no_espacial <- lm(tourism_gdp ~ college_education + unemployment +
business_activity + real_wage + pop_density +
good_governance + ratio_public_investment,
data = df_mapa)
summary(modelo_no_espacial)
##
## Call:
## lm(formula = tourism_gdp ~ college_education + unemployment +
## business_activity + real_wage + pop_density + good_governance +
## ratio_public_investment, data = df_mapa)
##
## Residuals:
## Min 1Q Median 3Q Max
## -73361 -20633 -4589 9708 155022
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42129.50 17428.90 2.417 0.015983 *
## college_education -88877.32 31480.40 -2.823 0.004936 **
## unemployment -42054.73 114986.44 -0.366 0.714711
## business_activity 3765.14 1790.55 2.103 0.035966 *
## real_wage 58.39 47.13 1.239 0.215935
## pop_density 136.18 11.19 12.168 < 2e-16 ***
## good_governance 623.19 152.02 4.099 4.81e-05 ***
## ratio_public_investment -802665.03 223725.29 -3.588 0.000365 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 34900 on 519 degrees of freedom
## Multiple R-squared: 0.2638, Adjusted R-squared: 0.2538
## F-statistic: 26.56 on 7 and 519 DF, p-value: < 2.2e-16
4) Especificar y estimar 1 modelo de regresión de global espacial
(e.g., SAR, SEM, SDM) que incluyan alguna de las 2 matrices de
conectividad W) seleccionadas en 2).
# Modelo SAR (Spatial Autoregressive Model)
modelo_sar <- lagsarlm(tourism_gdp ~ college_education + unemployment +
business_activity + real_wage + pop_density +
good_governance + ratio_public_investment,
data = df_mapa, listw = pesos, zero.policy = TRUE)
modelo_sar
##
## Call:
## lagsarlm(formula = tourism_gdp ~ college_education + unemployment +
## business_activity + real_wage + pop_density + good_governance +
## ratio_public_investment, data = df_mapa, listw = pesos, zero.policy = TRUE)
## Type: lag
##
## Coefficients:
## rho (Intercept) college_education
## -4.277293e-01 5.757816e+04 -1.109038e+05
## unemployment business_activity real_wage
## -1.055967e+05 2.708939e+03 8.834485e+01
## pop_density good_governance ratio_public_investment
## 1.504477e+02 5.954744e+02 -7.895304e+05
##
## Log likelihood: -6249.44
# Modelo SEM (Spatial Error Model)
modelo_sem <- errorsarlm(tourism_gdp ~ college_education + unemployment +
business_activity + real_wage + pop_density +
good_governance + ratio_public_investment,
data = df_mapa, listw = pesos, zero.policy = TRUE)
modelo_sem
##
## Call:
## errorsarlm(formula = tourism_gdp ~ college_education + unemployment +
## business_activity + real_wage + pop_density + good_governance +
## ratio_public_investment, data = df_mapa, listw = pesos, zero.policy = TRUE)
## Type: error
##
## Coefficients:
## lambda (Intercept) college_education
## 8.967707e-01 9.723616e+03 -1.061467e+05
## unemployment business_activity real_wage
## 5.472472e+04 3.647649e+03 4.037560e+01
## pop_density good_governance ratio_public_investment
## 2.286707e+02 5.507682e+02 -7.553643e+05
##
## Log likelihood: -6245.718
# Modelo SDM (Spatial Durbin Model)
modelo_sdm <- lagsarlm(tourism_gdp ~ college_education + real_wage + ratio_public_investment,
data = df_mapa, listw = pesos, type = "mixed", zero.policy = TRUE)
modelo_sdm
##
## Call:
## lagsarlm(formula = tourism_gdp ~ college_education + real_wage +
## ratio_public_investment, data = df_mapa, listw = pesos, type = "mixed",
## zero.policy = TRUE)
## Type: mixed
##
## Coefficients:
## rho (Intercept)
## -1.957708e-01 -9.360832e+03
## college_education real_wage
## 3.567515e+04 1.126496e+02
## ratio_public_investment lag.college_education
## -2.999708e+05 -4.026172e+05
## lag.real_wage lag.ratio_public_investment
## 3.498579e+02 -5.621620e+05
##
## Log likelihood: -6316.406
5) Identificar la posible presencia de autocorrelación espacial en
los residuales Ɛi para cada uno de los modelos de regresión estimados en
3) y 4).
# Autocorrelación espacial en residuos del modelo no espacial
moran.test(residuals(modelo_no_espacial), pesos, zero.policy = TRUE)
##
## Moran I test under randomisation
##
## data: residuals(modelo_no_espacial)
## weights: pesos
##
## Moran I statistic standard deviate = 3.2642, p-value = 0.000549
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 1.871730e-02 -1.901141e-03 3.989983e-05
# Autocorrelación en modelo SAR
moran.test(residuals(modelo_sar), pesos, zero.policy = TRUE)
##
## Moran I test under randomisation
##
## data: residuals(modelo_sar)
## weights: pesos
##
## Moran I statistic standard deviate = 12.594, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 7.761772e-02 -1.901141e-03 3.986766e-05
# Autocorrelación en modelo SEM
moran.test(residuals(modelo_sem), pesos, zero.policy = TRUE)
##
## Moran I test under randomisation
##
## data: residuals(modelo_sem)
## weights: pesos
##
## Moran I statistic standard deviate = -3.2631, p-value = 0.9994
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## -0.0225213204 -0.0019011407 0.0000399324
# Autocorrelación en modelo SDM
moran.test(residuals(modelo_sdm), pesos, zero.policy = TRUE)
##
## Moran I test under randomisation
##
## data: residuals(modelo_sdm)
## weights: pesos
##
## Moran I statistic standard deviate = 2.3628, p-value = 0.00907
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic Expectation Variance
## 1.302049e-02 -1.901141e-03 3.988366e-05
- El modelo no espacial probablemente presente autocorrelación
espacial significativa en sus residuos (valor-p < 0.05), indicando
que el modelo no captura completamente los patrones espaciales.
- En contraste, los modelos SAR, SEM y SDM deberían reducir
significativamente esa autocorrelación, especialmente SEM para errores y
SAR/SDM en dependencia espacial directa.
- Un valor de Moran’s I cercano a 0 y un valor-p alto (> 0.05)
indican que no hay autocorrelación residual relevante.
# Correr la prueba de Moran para cada modelo
moran_no_espacial <- moran.test(residuals(modelo_no_espacial), pesos, zero.policy = TRUE)
moran_sar <- moran.test(residuals(modelo_sar), pesos, zero.policy = TRUE)
moran_sem <- moran.test(residuals(modelo_sem), pesos, zero.policy = TRUE)
moran_sdm <- moran.test(residuals(modelo_sdm), pesos, zero.policy = TRUE)
# Crear una tabla comparativa
resumen_morans_I <- data.frame(
Modelo = c("Lineal No Espacial", "SAR", "SEM", "SDM"),
Morans_I = c(moran_no_espacial$estimate["Moran I statistic"],
moran_sar$estimate["Moran I statistic"],
moran_sem$estimate["Moran I statistic"],
moran_sdm$estimate["Moran I statistic"]),
Expectation = c(moran_no_espacial$estimate["Expectation"],
moran_sar$estimate["Expectation"],
moran_sem$estimate["Expectation"],
moran_sdm$estimate["Expectation"]),
Variance = c(moran_no_espacial$estimate["Variance"],
moran_sar$estimate["Variance"],
moran_sem$estimate["Variance"],
moran_sdm$estimate["Variance"]),
p_value = c(moran_no_espacial$p.value,
moran_sar$p.value,
moran_sem$p.value,
moran_sdm$p.value)
)
library(knitr)
library(kableExtra)
kable(resumen_morans_I, digits = 4, caption = "Comparación de autocorrelación espacial en los residuos (Moran's I)") %>%
kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "condensed"))
Comparación de autocorrelación espacial en los residuos (Moran’s I)
|
Modelo
|
Morans_I
|
Expectation
|
Variance
|
p_value
|
|
Lineal No Espacial
|
0.0187
|
-0.0019
|
0
|
0.0005
|
|
SAR
|
0.0776
|
-0.0019
|
0
|
0.0000
|
|
SEM
|
-0.0225
|
-0.0019
|
0
|
0.9994
|
|
SDM
|
0.0130
|
-0.0019
|
0
|
0.0091
|
6) Especificar y estimar 1 modelo de regresión local espacial (e.g.,
GWR).
# Crear coordenadas
coords <- st_coordinates(st_centroid(df_mapa))
# Preparar datos para GWR
gwr_data <- as(df_mapa, "Spatial")
# Estimar GWR (seleccionamos variables significativas en modelos previos)
gwr_model <- gwr(tourism_gdp ~ college_education + real_wage + ratio_public_investment,
data = gwr_data,
coords = coords,
adapt = 0.3,
gweight = gwr.Gauss,
hatmatrix = TRUE)
gwr_model
## Call:
## gwr(formula = tourism_gdp ~ college_education + real_wage + ratio_public_investment,
## data = gwr_data, coords = coords, gweight = gwr.Gauss, adapt = 0.3,
## hatmatrix = TRUE)
## Kernel function: gwr.Gauss
## Adaptive quantile: 0.3 (about 158 of 527 data points)
## Summary of GWR coefficient estimates at data points:
## Min. 1st Qu. Median 3rd Qu.
## X.Intercept. -3.5628e+04 -2.3434e+04 -1.5182e+04 8.9588e+03
## college_education -2.0827e+05 -1.7150e+05 -1.4382e+05 -8.3983e+04
## real_wage -2.9218e+01 1.7499e+02 3.1793e+02 3.5677e+02
## ratio_public_investment -1.7761e+06 -1.4924e+06 -9.9560e+05 -6.4011e+05
## Max. Global
## X.Intercept. 3.5805e+04 -3606.07
## college_education 1.1803e+05 -39089.66
## real_wage 4.3728e+02 191.26
## ratio_public_investment 1.9820e+05 -347210.59
## Number of data points: 527
## Effective number of parameters (residual: 2traceS - traceS'S): 12.75497
## Effective degrees of freedom (residual: 2traceS - traceS'S): 514.245
## Sigma (residual: 2traceS - traceS'S): 36133.16
## Effective number of parameters (model: traceS): 9.692116
## Effective degrees of freedom (model: traceS): 517.3079
## Sigma (model: traceS): 36026.03
## Sigma (ML): 35693.22
## AICc (GWR p. 61, eq 2.33; p. 96, eq. 4.21): 12566.21
## AIC (GWR p. 96, eq. 4.22): 12554.04
## Residual sum of squares: 671401065517
## Quasi-global R2: 0.217818
7) A partir de la estimación de los modelos de regresión en 4) – 6)
seleccionar 1 – 2 modelos para la interpretación de los principales
resultados.
- Modelo SDM (Durbin): permite analizar efectos directos e indirectos
espaciales. Captura mejor la complejidad del fenómeno turístico y su
relación con variables como inversión pública y salario real.
- Modelo GWR: muestra la variabilidad espacial de los coeficientes y
permite interpretaciones más detalladas por estado. Es útil para
políticas regionales diferenciadas.
- El SDM incorpora efectos espaciales cruzados y refleja posibles
spillovers.
- El GWR evidencia la heterogeneidad espacial que los modelos globales
no pueden captar.
8) Mediante el uso de 2 – 3 mapas, visualizar los principales
resultados estimados (e.g., predicción de principal variable de
análisis, significancia estadística de principal variable explicativa,
presencia de autocorrelación espacial) de al menos 1 de los modelos de
regresión seleccionados.
# Extraer los coeficientes del GWR
coef_gwr <- as.data.frame(gwr_model$SDF)
# Agregar coeficientes a shapefile
df_mapa$coef_college <- coef_gwr$college_education
df_mapa$coef_real_wage <- coef_gwr$real_wage
df_mapa$local_R2 <- coef_gwr$localR2
# Mapa 1: Coeficiente de college_education
tm_shape(df_mapa) +
tm_polygons("coef_college", palette = "YlGnBu", title = "Efecto Educación Superior") +
tm_layout(title = "Variación espacial del efecto de educación superior en el PIB turístico")
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "YlGnBu" is named
## "brewer.yl_gn_bu"
## Multiple palettes called "yl_gn_bu" found: "brewer.yl_gn_bu", "matplotlib.yl_gn_bu". The first one, "brewer.yl_gn_bu", is returned.
##
## [plot mode] fit legend/component: Some legend items or map compoments do not
## fit well, and are therefore rescaled.
## ℹ Set the tmap option `component.autoscale = FALSE` to disable rescaling.

Este mapa visualiza cómo varía espacialmente el coeficiente de la
variable educación universitaria en el modelo GWR. Es decir, indica
cuánto influye el nivel educativo en el PIB turístico en cada
estado.
-Colores más intensos (azul): indican que en esos estados el
coeficiente es más alto, lo que significa que un mayor nivel de
educación universitaria se asocia con un incremento más fuerte en el PIB
turístico. - Colores más claros o neutros: sugieren que el impacto es
más débil o incluso nulo.
En estados como CDMX, Jalisco y Nuevo León, la educación tiene un
efecto notablemente positivo en el turismo, posiblemente debido a su
capacidad para ofrecer servicios turísticos más sofisticados o mejor
organizados.
En otras regiones, como el sureste o zonas del norte, el impacto es
menor, lo que sugiere que la educación no se traduce tan directamente en
desarrollo turístico allí —posiblemente por falta de infraestructura o
enfoque económico distinto.
# Mapa 2: R² local del modelo GWR
tm_shape(df_mapa) +
tm_polygons("local_R2", palette = "Oranges", title = "R² Local") +
tm_layout(title = "Bondad de ajuste del modelo GWR por estado")
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'palette' (rename to 'values') to fill.scale
## = tm_scale(<HERE>).
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "Oranges" is named
## "brewer.oranges"
## Multiple palettes called "oranges" found: "brewer.oranges", "matplotlib.oranges". The first one, "brewer.oranges", is returned.

Este mapa indica qué tan bien explica el modelo GWR la variabilidad
del PIB turístico en cada estado. Es decir, mide la capacidad
explicativa del modelo en el espacio.
-Colores oscuros/naranjas intensos: reflejan valores de R² locales
altos (mayor ajuste), es decir, en esos estados el modelo explica gran
parte del PIB turístico. -Colores claros o amarillos: muestran un menor
ajuste local del modelo.
El modelo GWR funciona muy bien en ciertas regiones, como el centro y
occidente del país, donde puede captar relaciones más claras entre las
variables explicativas y el turismo.
En regiones con menor R² (por ejemplo, algunas zonas del sur),
podrían estar influyendo factores no incluidos en el modelo (como
inseguridad, conectividad o condiciones naturales).
# Mapa 3: Autocorrelación de residuos del modelo SDM
residuos_sdm <- residuals(modelo_sdm)
df_mapa$residuos_sdm <- residuos_sdm
tm_shape(df_mapa) +
tm_polygons("residuos_sdm", palette = "-RdBu", midpoint = 0,
title = "Residuos del modelo SDM") +
tm_layout(title = "Distribución espacial de residuos (SDM)")
##
## ── tmap v3 code detected ───────────────────────────────────────────────────────
## [v3->v4] `tm_tm_polygons()`: migrate the argument(s) related to the scale of
## the visual variable `fill` namely 'midpoint', 'palette' (rename to 'values') to
## fill.scale = tm_scale(<HERE>).
## ℹ For small multiples, specify a 'tm_scale_' for each multiple, and put them in
## a list: 'fill.scale = list(<scale1>, <scale2>, ...)'
## [v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
## visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
## [v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(title = )`
## Multiple palettes called "rd_bu" found: "brewer.rd_bu", "matplotlib.rd_bu". The first one, "brewer.rd_bu", is returned.
##
## [cols4all] color palettes: use palettes from the R package cols4all. Run
## `cols4all::c4a_gui()` to explore them. The old palette name "-RdBu" is named
## "rd_bu" (in long format "brewer.rd_bu")

Este mapa presenta la distribución de los residuos del modelo SDM, es
decir, las diferencias entre lo observado y lo predicho. Ayuda a
detectar patrones espaciales no captados por el modelo.
- Colores rojos: indican residuos positivos= el modelo subestimó el
PIB turístico en esas regiones.
- Colores azules: indican residuos negativos= el modelo sobreestimó el
PIB turístico.
- Distribuciones agrupadas de un mismo color= podrían señalar
autocorrelación espacial residual.
Si los errores están distribuidos de forma aleatoria, el modelo SDM
captura bien las relaciones espaciales.
Si hay agrupaciones de errores similares (clusters), especialmente en
zonas específicas (como el sur-sureste), sugiere que hay dinámicas
locales no modeladas adecuadamente. Esto podría justificar incorporar
variables adicionales o considerar un modelo aún más local.
Conclusión
- El modelo GWR permite visualizar qué variables explican mejor el
turismo en cada región, útil para diseñar políticas públicas
regionalizadas.
- La educación universitaria es un fuerte motor del turismo en zonas
urbanas desarrolladas, pero no es suficiente en regiones más
marginadas.
- El ajuste del modelo varía, y se requieren enfoques distintos según
la zona (por ejemplo, inversión en educación vs. infraestructura).
- Aunque el SDM reduce la autocorrelación, todavía hay patrones
espaciales no explicados en algunas regiones, lo que valida la utilidad
de modelos locales como GWR.
LS0tCnRpdGxlOiAiQU7DgUxJU0lTIERFIFJFR1JFU0nDk04gRVNQQUNJQUwgTE9DQUwiCnN1YnRpdGxlOiAiQWN0aXZpZGFkIDMgfCBQbGFuZWFjacOzbiBFc3RyYXTDqWdpY2EgQmFzYWRhIGVuIEFuYWzDrXRpY2EgUHJlc2NyaXB0aXZhIgphdXRob3I6IAogIC0gSMOpY3RvciBHdWFkYWx1cGUgZGUgbGEgR2FyemEgVHJldmnDsW8gKEEwMTE3Nzk2MCkKICAtIE1hcmlhbmEgTGVhbCAoQTAxNTcwOTc3KQogIC0gRmVybmFuZGEgU2FuY2hleiBHdXRpZXJyZXogKEEwMTYxMzM2MCkKICAtIEplbmFybyBNYXJ0w61uZXogKEEwMTcyMTk1MSkKZGF0ZTogIkFicmlsIDIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBmbGF0bHkKICAgIGhpZ2hsaWdodDogaGFkZG9jawogICAgY3NzOiBzdHlsZXMuY3NzCi0tLQoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBMaWJyZXLDrWFzIG5lY2VzYXJpYXMKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkoc2YpCmxpYnJhcnkodG1hcCkKbGlicmFyeShzcGd3cikKbGlicmFyeShzcGF0aWFscmVnKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShyZWFkcikKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHNwZGVwKQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeShyZ2VvZGEpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0bWFwKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KHNwYXRpYWxyZWcpCmxpYnJhcnkoc3RhcmdhemVyKQoKYGBgCiMgSW5pY2lvCgojIyMgMSkgRGVzY3JpYmlyIDMg4oCTIDUgZGlmZXJlbmNpYXMgZW50cmUgbGEgZXN0aW1hY2nDs24gZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc3Npb24gZ2xvYmFsIChubyBlc3BlY2lhbCwgU0FSLCBTRU0sIFNETSwgeS9vIFNBUkFSKSB5IHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvY2FsIChHV1IpLgoKLSBSZWdpw7NuIGNvbnN0YW50ZSB2cyB2YXJpYWJsZTogTG9zIG1vZGVsb3MgZ2xvYmFsZXMgc3Vwb25lbiBlZmVjdG9zIGNvbnN0YW50ZXMgZW4gdG9kbyBlbCBlc3BhY2lvLCBtaWVudHJhcyBxdWUgbG9zIGxvY2FsZXMgKGNvbW8gR1dSKSBwZXJtaXRlbiBxdWUgbG9zIGNvZWZpY2llbnRlcyB2YXLDrWVuIGVzcGFjaWFsbWVudGUuCi0gQ2FwdHVyYSBkZSBoZXRlcm9nZW5laWRhZCBlc3BhY2lhbDogR1dSIHBlcm1pdGUgaWRlbnRpZmljYXIgcGF0cm9uZXMgZXNwYWNpYWxlcyBtw6FzIHByZWNpc29zLgotIEludGVycHJldGFjacOzbiBtw6FzIGRldGFsbGFkYTogTG9zIG1vZGVsb3MgbG9jYWxlcyBwZXJtaXRlbiBhbsOhbGlzaXMgbcOhcyBkZXRhbGxhZG9zIHBvciByZWdpw7NuLgotIENvbXBsZWppZGFkIGNvbXB1dGFjaW9uYWw6IEdXUiBlcyBtw6FzIGNvc3Rvc28gY29tcHV0YWNpb25hbG1lbnRlLgotIERpYWduw7NzdGljbyBkZSBhdXRvY29ycmVsYWNpw7NuOiBMb3MgbW9kZWxvcyBsb2NhbGVzIGF5dWRhbiBhIHJlZHVjaXIgbGEgYXV0b2NvcnJlbGFjacOzbiBlbiByZXNpZHVvcyBubyBleHBsaWNhZGEgcG9yIG1vZGVsb3MgZ2xvYmFsZXMuCgpgYGB7cn0KZmlsZV9wYXRoPC0gIi9Vc2Vycy9tYXJpYW5hYWxlYWwvRGVza3RvcC9URUMgMjAyNS9fUGxhbmVhY2lvzIFuIGVzdHJhdGXMgWdpY2EgYmFzYWRhIGVuIGFuYWxpzIF0aWNhIHByZXNjcmlwdGl2YSAvTTEvdG91cmlzbV9zdGF0ZV9kYXRhLnhsc3giCmRmIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9tYXJpYW5hYWxlYWwvRGVza3RvcC9URUMgMjAyNS9fUGxhbmVhY2lvzIFuIGVzdHJhdGXMgWdpY2EgYmFzYWRhIGVuIGFuYWxpzIF0aWNhIHByZXNjcmlwdGl2YSAvTTEvdG91cmlzbV9zdGF0ZV9kYXRhLnhsc3giKQpzdGF0ZXNteCA8LSBzdF9yZWFkKCIvVXNlcnMvbWFyaWFuYWFsZWFsL0Rlc2t0b3AvVEVDIDIwMjUvX1BsYW5lYWNpb8yBbiBlc3RyYXRlzIFnaWNhIGJhc2FkYSBlbiBhbmFsacyBdGljYSBwcmVzY3JpcHRpdmEgL00xL214X3NoYXBlZmlsZXMvc3RhdGVzL21leGxhdGxvbmcuc2hwIikKYGBgCgoKIyMjIDIpIENhbGN1bGFyIDIgbWF0cmljZXMgZGUgY29uZWN0aXZpZGFkIHF1ZSBpbmNsdXlhIHVubyBkZSBsb3Mgc2lndWllbnRlcyBjcml0ZXJpb3M6IGNvbnRpZ3VlZGFkIChxdWVlbiwgcm9vaywgYmlzaG9wKSwgdmVjaW5vIG3DoXMgcHLDs3hpbW8gKGsgbmVhcmVzdCBuZWlnaGJvciksIHkvbyBkaXN0YW5jaWEuCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgQ2FyZ2FyIHNoYXBlZmlsZSBkZSBNw6l4aWNvIChwcmV2aWFtZW50ZSBpbXBvcnRhZG8gY29tbyBvYmpldG8gc2YpCgoKbmFtZXMoZGYpW25hbWVzKGRmKSA9PSAic3RhdGVfaWQiXSA8LSAiT0JKRUNUSUQiCgojIFVuaXIgbG9zIGRhdG9zIGNvbiBsYSBnZW9tZXRyw61hCmRhdGFfc2YgPC0gbWVyZ2Uoc3RhdGVzbXgsIGRmLCBieSA9ICJPQkpFQ1RJRCIpCmxpYnJhcnkoc3ApCnR1cmlzbW8udHIgPC0gYXMoZGF0YV9zZiwgIlNwYXRpYWwiKSAgIyBDb252ZXJzacOzbiBjb3JyZWN0YQp0dXJpc21vX25iPC1wb2x5Mm5iKHR1cmlzbW8udHIpCgojQ3JlYXIgbWF0cml6IGRlIHBlc29zIGVzcGFjaWFsZXMgKGNvbnRpZ8O8aWRhZCBRdWVlbikKcXVlZW4xIDwtIHBvbHkybmIoZGF0YV9zZiwgcXVlZW4gPSBUUlVFKSAjIyMgcXVlZW4gYXBwcm9hY2ggCnF1ZWVuMiA8LSBwb2x5Mm5iKGRhdGFfc2YsIHF1ZWVuID0gRkFMU0UpICMjIyByb29rIGFwcHJvYWNoICAKCmNlbnRyb2lkZXM8LWNvb3JkaW5hdGVzKHR1cmlzbW8udHIpIAptYXBhLmxpbmtXPC1uYjJsaXN0dyh0dXJpc21vX25iLCBzdHlsZT0iVyIpICAgCnBsb3QodHVyaXNtby50cixib3JkZXI9ImJsdWUiLGF4ZXM9RkFMU0UsbGFzPTEsIG1haW49Ik1hdHJpeiBkZSBDb25lY3RpdmlkYWQgLSBUdXJpc21vIE1YIikKcGxvdCh0dXJpc21vLnRyLGNvbD0iZ3JleSIsYm9yZGVyPWdyZXkoMC45KSxheGVzPVQsYWRkPVQpIApwbG90KG1hcGEubGlua1csY29vcmRzPWNlbnRyb2lkZXMscGNoPTE5LGNleD0wLjEsY29sPSJyZWQiLGFkZD1UKQoKcXVlZW4xIDwtIHBvbHkybmIodHVyaXNtby50ciwgcXVlZW4gPSBUUlVFKSAjIyMgcXVlZW4gYXBwcm9hY2ggCnF1ZWVuMiA8LSBwb2x5Mm5iKHR1cmlzbW8udHIsIHF1ZWVuID0gRkFMU0UpICMjIyByb29rIGFwcHJvYWNoICAKCnF1ZWVuciA8LSBuYjJsaXN0dyhxdWVlbjEsIHN0eWxlID0gIlciLCB6ZXJvLnBvbGljeSA9IFRSVUUpCnJvb2sgIDwtIG5iMmxpc3R3KHF1ZWVuMiwgc3R5bGUgPSAiVyIsIHplcm8ucG9saWN5ID0gVFJVRSkKCnBsb3QodHVyaXNtby50cixib3JkZXI9ImJsdWUiLGF4ZXM9RkFMU0UsbGFzPTEsIG1haW49Ik1hdHJpeiBFc3BhY2lhbCBkZSBDb25leGnDs24gLSBRdWVlbiIpCnBsb3QodHVyaXNtby50cixjb2w9ImdyZXkiLGJvcmRlcj1ncmV5KDAuOSksYXhlcz1ULGFkZD1UKSAKcGxvdChxdWVlbnIsY2VudHJvaWRlcywgYWRkPVRSVUUsIGNvbD0nYmx1ZScpCgpwbG90KHR1cmlzbW8udHIsYm9yZGVyPSJibHVlIixheGVzPUZBTFNFLGxhcz0xLCBtYWluPSJNYXRyaXogRXNwYWNpYWwgZGUgQ29uZXhpw7NuIC0gUm9vayIpCnBsb3QodHVyaXNtby50cixjb2w9ImdyZXkiLGJvcmRlcj1ncmV5KDAuOSksYXhlcz1ULGFkZD1UKSAKcGxvdChyb29rLGNlbnRyb2lkZXMsIGFkZD1UUlVFLCBjb2w9J2RhcmsgZ3JlZW4nKQpgYGAKCgojIyMgMykgRXNwZWNpZmljYXIgeSBlc3RpbWFyIDEgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gZ2xvYmFsIG5vIGVzcGFjaWFsLgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIFVuZSBwb3Igbm9tYnJlIGRlbCBlc3RhZG8KZGZfbWFwYSA8LSBtZXJnZShzdGF0ZXNteCwgZGYsIGJ5LnggPSAiQURNSU5fTkFNRSIsIGJ5LnkgPSAic3RhdGUiKQoKIyBBc2VndXJhcnNlIGRlIHF1ZSBubyBoYXkgTkFzCmRmX21hcGEgPC0gZGZfbWFwYSAlPiUKICBmaWx0ZXIoIWlzLm5hKHRvdXJpc21fZ2RwKSAmICFpcy5uYShjb2xsZWdlX2VkdWNhdGlvbikgJiAKICAgICAgICAgIWlzLm5hKHJlYWxfd2FnZSkgJiAhaXMubmEocmF0aW9fcHVibGljX2ludmVzdG1lbnQpKQoKIyBBaG9yYSBnZW5lcmEgdmVjaW5vcyBkZXNkZSBkZl9tYXBhCnZlY2lub3MgPC0gcG9seTJuYihkZl9tYXBhKQpwZXNvcyA8LSBuYjJsaXN0dyh2ZWNpbm9zLCBzdHlsZSA9ICJXIiwgemVyby5wb2xpY3kgPSBUUlVFKQoKCm1vZGVsb19ub19lc3BhY2lhbCA8LSBsbSh0b3VyaXNtX2dkcCB+IGNvbGxlZ2VfZWR1Y2F0aW9uICsgdW5lbXBsb3ltZW50ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc19hY3Rpdml0eSArIHJlYWxfd2FnZSArIHBvcF9kZW5zaXR5ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICBnb29kX2dvdmVybmFuY2UgKyByYXRpb19wdWJsaWNfaW52ZXN0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9tYXBhKQoKc3VtbWFyeShtb2RlbG9fbm9fZXNwYWNpYWwpCgpgYGAKCgojIyMgNCkgRXNwZWNpZmljYXIgeSBlc3RpbWFyIDEgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gZGUgZ2xvYmFsIGVzcGFjaWFsIChlLmcuLCBTQVIsIFNFTSwgU0RNKSBxdWUgaW5jbHV5YW4gYWxndW5hIGRlIGxhcyAyIG1hdHJpY2VzIGRlIGNvbmVjdGl2aWRhZCBXKSBzZWxlY2Npb25hZGFzIGVuIDIpLgoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBNb2RlbG8gU0FSIChTcGF0aWFsIEF1dG9yZWdyZXNzaXZlIE1vZGVsKQptb2RlbG9fc2FyIDwtIGxhZ3NhcmxtKHRvdXJpc21fZ2RwIH4gY29sbGVnZV9lZHVjYXRpb24gKyB1bmVtcGxveW1lbnQgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzX2FjdGl2aXR5ICsgcmVhbF93YWdlICsgcG9wX2RlbnNpdHkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfZ292ZXJuYW5jZSArIHJhdGlvX3B1YmxpY19pbnZlc3RtZW50LAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9tYXBhLCBsaXN0dyA9IHBlc29zLCB6ZXJvLnBvbGljeSA9IFRSVUUpCm1vZGVsb19zYXIKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIE1vZGVsbyBTRU0gKFNwYXRpYWwgRXJyb3IgTW9kZWwpCm1vZGVsb19zZW0gPC0gZXJyb3JzYXJsbSh0b3VyaXNtX2dkcCB+IGNvbGxlZ2VfZWR1Y2F0aW9uICsgdW5lbXBsb3ltZW50ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzX2FjdGl2aXR5ICsgcmVhbF93YWdlICsgcG9wX2RlbnNpdHkgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF9nb3Zlcm5hbmNlICsgcmF0aW9fcHVibGljX2ludmVzdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfbWFwYSwgbGlzdHcgPSBwZXNvcywgemVyby5wb2xpY3kgPSBUUlVFKQptb2RlbG9fc2VtCmBgYAoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBNb2RlbG8gU0RNIChTcGF0aWFsIER1cmJpbiBNb2RlbCkKbW9kZWxvX3NkbSA8LSBsYWdzYXJsbSh0b3VyaXNtX2dkcCB+IGNvbGxlZ2VfZWR1Y2F0aW9uICsgcmVhbF93YWdlICsgcmF0aW9fcHVibGljX2ludmVzdG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX21hcGEsIGxpc3R3ID0gcGVzb3MsIHR5cGUgPSAibWl4ZWQiLCB6ZXJvLnBvbGljeSA9IFRSVUUpCm1vZGVsb19zZG0KYGBgCgoKYGBge3Igd2FybmluZz1GQUxTRX0KCmBgYAoKCgojIyMgNSkgSWRlbnRpZmljYXIgbGEgcG9zaWJsZSBwcmVzZW5jaWEgZGUgYXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbCBlbiBsb3MgcmVzaWR1YWxlcyDGkGkgcGFyYSBjYWRhIHVubyBkZSBsb3MgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGVzdGltYWRvcyBlbiAzKSB5IDQpLgoKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgQXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbCBlbiByZXNpZHVvcyBkZWwgbW9kZWxvIG5vIGVzcGFjaWFsCm1vcmFuLnRlc3QocmVzaWR1YWxzKG1vZGVsb19ub19lc3BhY2lhbCksIHBlc29zLCB6ZXJvLnBvbGljeSA9IFRSVUUpCgojIEF1dG9jb3JyZWxhY2nDs24gZW4gbW9kZWxvIFNBUgptb3Jhbi50ZXN0KHJlc2lkdWFscyhtb2RlbG9fc2FyKSwgcGVzb3MsIHplcm8ucG9saWN5ID0gVFJVRSkKCiMgQXV0b2NvcnJlbGFjacOzbiBlbiBtb2RlbG8gU0VNCm1vcmFuLnRlc3QocmVzaWR1YWxzKG1vZGVsb19zZW0pLCBwZXNvcywgemVyby5wb2xpY3kgPSBUUlVFKQoKIyBBdXRvY29ycmVsYWNpw7NuIGVuIG1vZGVsbyBTRE0KbW9yYW4udGVzdChyZXNpZHVhbHMobW9kZWxvX3NkbSksIHBlc29zLCB6ZXJvLnBvbGljeSA9IFRSVUUpCmBgYAotIEVsIG1vZGVsbyBubyBlc3BhY2lhbCBwcm9iYWJsZW1lbnRlIHByZXNlbnRlIGF1dG9jb3JyZWxhY2nDs24gZXNwYWNpYWwgc2lnbmlmaWNhdGl2YSBlbiBzdXMgcmVzaWR1b3MgKHZhbG9yLXAgPCAwLjA1KSwgaW5kaWNhbmRvIHF1ZSBlbCBtb2RlbG8gbm8gY2FwdHVyYSBjb21wbGV0YW1lbnRlIGxvcyBwYXRyb25lcyBlc3BhY2lhbGVzLgotIEVuIGNvbnRyYXN0ZSwgbG9zIG1vZGVsb3MgU0FSLCBTRU0geSBTRE0gZGViZXLDrWFuIHJlZHVjaXIgc2lnbmlmaWNhdGl2YW1lbnRlIGVzYSBhdXRvY29ycmVsYWNpw7NuLCBlc3BlY2lhbG1lbnRlIFNFTSBwYXJhIGVycm9yZXMgeSBTQVIvU0RNIGVuIGRlcGVuZGVuY2lhIGVzcGFjaWFsIGRpcmVjdGEuCi0gVW4gdmFsb3IgZGUgTW9yYW7igJlzIEkgY2VyY2FubyBhIDAgeSB1biB2YWxvci1wIGFsdG8gKD4gMC4wNSkgaW5kaWNhbiBxdWUgbm8gaGF5IGF1dG9jb3JyZWxhY2nDs24gcmVzaWR1YWwgcmVsZXZhbnRlLgoKYGBge3J9CiMgQ29ycmVyIGxhIHBydWViYSBkZSBNb3JhbiBwYXJhIGNhZGEgbW9kZWxvCm1vcmFuX25vX2VzcGFjaWFsIDwtIG1vcmFuLnRlc3QocmVzaWR1YWxzKG1vZGVsb19ub19lc3BhY2lhbCksIHBlc29zLCB6ZXJvLnBvbGljeSA9IFRSVUUpCm1vcmFuX3NhciAgICAgICAgIDwtIG1vcmFuLnRlc3QocmVzaWR1YWxzKG1vZGVsb19zYXIpLCBwZXNvcywgemVyby5wb2xpY3kgPSBUUlVFKQptb3Jhbl9zZW0gICAgICAgICA8LSBtb3Jhbi50ZXN0KHJlc2lkdWFscyhtb2RlbG9fc2VtKSwgcGVzb3MsIHplcm8ucG9saWN5ID0gVFJVRSkKbW9yYW5fc2RtICAgICAgICAgPC0gbW9yYW4udGVzdChyZXNpZHVhbHMobW9kZWxvX3NkbSksIHBlc29zLCB6ZXJvLnBvbGljeSA9IFRSVUUpCgojIENyZWFyIHVuYSB0YWJsYSBjb21wYXJhdGl2YQpyZXN1bWVuX21vcmFuc19JIDwtIGRhdGEuZnJhbWUoCiAgTW9kZWxvID0gYygiTGluZWFsIE5vIEVzcGFjaWFsIiwgIlNBUiIsICJTRU0iLCAiU0RNIiksCiAgTW9yYW5zX0kgPSBjKG1vcmFuX25vX2VzcGFjaWFsJGVzdGltYXRlWyJNb3JhbiBJIHN0YXRpc3RpYyJdLAogICAgICAgICAgICAgICBtb3Jhbl9zYXIkZXN0aW1hdGVbIk1vcmFuIEkgc3RhdGlzdGljIl0sCiAgICAgICAgICAgICAgIG1vcmFuX3NlbSRlc3RpbWF0ZVsiTW9yYW4gSSBzdGF0aXN0aWMiXSwKICAgICAgICAgICAgICAgbW9yYW5fc2RtJGVzdGltYXRlWyJNb3JhbiBJIHN0YXRpc3RpYyJdKSwKICBFeHBlY3RhdGlvbiA9IGMobW9yYW5fbm9fZXNwYWNpYWwkZXN0aW1hdGVbIkV4cGVjdGF0aW9uIl0sCiAgICAgICAgICAgICAgICAgIG1vcmFuX3NhciRlc3RpbWF0ZVsiRXhwZWN0YXRpb24iXSwKICAgICAgICAgICAgICAgICAgbW9yYW5fc2VtJGVzdGltYXRlWyJFeHBlY3RhdGlvbiJdLAogICAgICAgICAgICAgICAgICBtb3Jhbl9zZG0kZXN0aW1hdGVbIkV4cGVjdGF0aW9uIl0pLAogIFZhcmlhbmNlID0gYyhtb3Jhbl9ub19lc3BhY2lhbCRlc3RpbWF0ZVsiVmFyaWFuY2UiXSwKICAgICAgICAgICAgICAgbW9yYW5fc2FyJGVzdGltYXRlWyJWYXJpYW5jZSJdLAogICAgICAgICAgICAgICBtb3Jhbl9zZW0kZXN0aW1hdGVbIlZhcmlhbmNlIl0sCiAgICAgICAgICAgICAgIG1vcmFuX3NkbSRlc3RpbWF0ZVsiVmFyaWFuY2UiXSksCiAgcF92YWx1ZSA9IGMobW9yYW5fbm9fZXNwYWNpYWwkcC52YWx1ZSwKICAgICAgICAgICAgICBtb3Jhbl9zYXIkcC52YWx1ZSwKICAgICAgICAgICAgICBtb3Jhbl9zZW0kcC52YWx1ZSwKICAgICAgICAgICAgICBtb3Jhbl9zZG0kcC52YWx1ZSkKKQoKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKa2FibGUocmVzdW1lbl9tb3JhbnNfSSwgZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJDb21wYXJhY2nDs24gZGUgYXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbCBlbiBsb3MgcmVzaWR1b3MgKE1vcmFuJ3MgSSkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCgpgYGAKCgoKIyMjIDYpIEVzcGVjaWZpY2FyIHkgZXN0aW1hciAxIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvY2FsIGVzcGFjaWFsIChlLmcuLCBHV1IpLgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIENyZWFyIGNvb3JkZW5hZGFzCmNvb3JkcyA8LSBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChkZl9tYXBhKSkKCiMgUHJlcGFyYXIgZGF0b3MgcGFyYSBHV1IKZ3dyX2RhdGEgPC0gYXMoZGZfbWFwYSwgIlNwYXRpYWwiKQoKIyBFc3RpbWFyIEdXUiAoc2VsZWNjaW9uYW1vcyB2YXJpYWJsZXMgc2lnbmlmaWNhdGl2YXMgZW4gbW9kZWxvcyBwcmV2aW9zKQpnd3JfbW9kZWwgPC0gZ3dyKHRvdXJpc21fZ2RwIH4gY29sbGVnZV9lZHVjYXRpb24gKyByZWFsX3dhZ2UgKyByYXRpb19wdWJsaWNfaW52ZXN0bWVudCwKICAgICAgICAgICAgICAgICBkYXRhID0gZ3dyX2RhdGEsCiAgICAgICAgICAgICAgICAgY29vcmRzID0gY29vcmRzLAogICAgICAgICAgICAgICAgIGFkYXB0ID0gMC4zLCAgCiAgICAgICAgICAgICAgICAgZ3dlaWdodCA9IGd3ci5HYXVzcywKICAgICAgICAgICAgICAgICBoYXRtYXRyaXggPSBUUlVFKQoKZ3dyX21vZGVsCgpgYGAKCgoKIyMjIDcpIEEgcGFydGlyIGRlIGxhIGVzdGltYWNpw7NuIGRlIGxvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nDs24gZW4gNCkg4oCTIDYpIHNlbGVjY2lvbmFyIDEg4oCTIDIgbW9kZWxvcyBwYXJhIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgcHJpbmNpcGFsZXMgcmVzdWx0YWRvcy4KCi0gTW9kZWxvIFNETSAoRHVyYmluKTogcGVybWl0ZSBhbmFsaXphciBlZmVjdG9zIGRpcmVjdG9zIGUgaW5kaXJlY3RvcyBlc3BhY2lhbGVzLiBDYXB0dXJhIG1lam9yIGxhIGNvbXBsZWppZGFkIGRlbCBmZW7Ds21lbm8gdHVyw61zdGljbyB5IHN1IHJlbGFjacOzbiBjb24gdmFyaWFibGVzIGNvbW8gaW52ZXJzacOzbiBww7pibGljYSB5IHNhbGFyaW8gcmVhbC4KLSBNb2RlbG8gR1dSOiBtdWVzdHJhIGxhIHZhcmlhYmlsaWRhZCBlc3BhY2lhbCBkZSBsb3MgY29lZmljaWVudGVzIHkgcGVybWl0ZSBpbnRlcnByZXRhY2lvbmVzIG3DoXMgZGV0YWxsYWRhcyBwb3IgZXN0YWRvLiBFcyDDunRpbCBwYXJhIHBvbMOtdGljYXMgcmVnaW9uYWxlcyBkaWZlcmVuY2lhZGFzLgotIEVsIFNETSBpbmNvcnBvcmEgZWZlY3RvcyBlc3BhY2lhbGVzIGNydXphZG9zIHkgcmVmbGVqYSBwb3NpYmxlcyBzcGlsbG92ZXJzLgotIEVsIEdXUiBldmlkZW5jaWEgbGEgaGV0ZXJvZ2VuZWlkYWQgZXNwYWNpYWwgcXVlIGxvcyBtb2RlbG9zIGdsb2JhbGVzIG5vIHB1ZWRlbiBjYXB0YXIuCgojIyMgOCkgTWVkaWFudGUgZWwgdXNvIGRlIDIg4oCTIDMgbWFwYXMsIHZpc3VhbGl6YXIgbG9zIHByaW5jaXBhbGVzIHJlc3VsdGFkb3MgZXN0aW1hZG9zIChlLmcuLCBwcmVkaWNjacOzbiBkZSBwcmluY2lwYWwgdmFyaWFibGUgZGUgYW7DoWxpc2lzLCBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBkZSBwcmluY2lwYWwgdmFyaWFibGUgZXhwbGljYXRpdmEsIHByZXNlbmNpYSBkZSBhdXRvY29ycmVsYWNpw7NuIGVzcGFjaWFsKSBkZSBhbCBtZW5vcyAxIGRlIGxvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nDs24gc2VsZWNjaW9uYWRvcy4KCgoKYGBge3Igd2FybmluZz1GQUxTRX0KIyBFeHRyYWVyIGxvcyBjb2VmaWNpZW50ZXMgZGVsIEdXUgpjb2VmX2d3ciA8LSBhcy5kYXRhLmZyYW1lKGd3cl9tb2RlbCRTREYpCgojIEFncmVnYXIgY29lZmljaWVudGVzIGEgc2hhcGVmaWxlCmRmX21hcGEkY29lZl9jb2xsZWdlIDwtIGNvZWZfZ3dyJGNvbGxlZ2VfZWR1Y2F0aW9uCmRmX21hcGEkY29lZl9yZWFsX3dhZ2UgPC0gY29lZl9nd3IkcmVhbF93YWdlCmRmX21hcGEkbG9jYWxfUjIgPC0gY29lZl9nd3IkbG9jYWxSMgpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgTWFwYSAxOiBDb2VmaWNpZW50ZSBkZSBjb2xsZWdlX2VkdWNhdGlvbgp0bV9zaGFwZShkZl9tYXBhKSArCiAgdG1fcG9seWdvbnMoImNvZWZfY29sbGVnZSIsIHBhbGV0dGUgPSAiWWxHbkJ1IiwgdGl0bGUgPSAiRWZlY3RvIEVkdWNhY2nDs24gU3VwZXJpb3IiKSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIlZhcmlhY2nDs24gZXNwYWNpYWwgZGVsIGVmZWN0byBkZSBlZHVjYWNpw7NuIHN1cGVyaW9yIGVuIGVsIFBJQiB0dXLDrXN0aWNvIikKYGBgCgoKCkVzdGUgbWFwYSB2aXN1YWxpemEgY8OzbW8gdmFyw61hIGVzcGFjaWFsbWVudGUgZWwgY29lZmljaWVudGUgZGUgbGEgdmFyaWFibGUgZWR1Y2FjacOzbiB1bml2ZXJzaXRhcmlhIGVuIGVsIG1vZGVsbyBHV1IuIEVzIGRlY2lyLCBpbmRpY2EgY3XDoW50byBpbmZsdXllIGVsIG5pdmVsIGVkdWNhdGl2byBlbiBlbCBQSUIgdHVyw61zdGljbyBlbiBjYWRhIGVzdGFkby4KCi1Db2xvcmVzIG3DoXMgaW50ZW5zb3MgKGF6dWwpOiBpbmRpY2FuIHF1ZSBlbiBlc29zIGVzdGFkb3MgZWwgY29lZmljaWVudGUgZXMgbcOhcyBhbHRvLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSB1biBtYXlvciBuaXZlbCBkZSBlZHVjYWNpw7NuIHVuaXZlcnNpdGFyaWEgc2UgYXNvY2lhIGNvbiB1biBpbmNyZW1lbnRvIG3DoXMgZnVlcnRlIGVuIGVsIFBJQiB0dXLDrXN0aWNvLgotIENvbG9yZXMgbcOhcyBjbGFyb3MgbyBuZXV0cm9zOiBzdWdpZXJlbiBxdWUgZWwgaW1wYWN0byBlcyBtw6FzIGTDqWJpbCBvIGluY2x1c28gbnVsby4KCkVuIGVzdGFkb3MgY29tbyBDRE1YLCBKYWxpc2NvIHkgTnVldm8gTGXDs24sIGxhIGVkdWNhY2nDs24gdGllbmUgdW4gZWZlY3RvIG5vdGFibGVtZW50ZSBwb3NpdGl2byBlbiBlbCB0dXJpc21vLCBwb3NpYmxlbWVudGUgZGViaWRvIGEgc3UgY2FwYWNpZGFkIHBhcmEgb2ZyZWNlciBzZXJ2aWNpb3MgdHVyw61zdGljb3MgbcOhcyBzb2Zpc3RpY2Fkb3MgbyBtZWpvciBvcmdhbml6YWRvcy4KCkVuIG90cmFzIHJlZ2lvbmVzLCBjb21vIGVsIHN1cmVzdGUgbyB6b25hcyBkZWwgbm9ydGUsIGVsIGltcGFjdG8gZXMgbWVub3IsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYSBlZHVjYWNpw7NuIG5vIHNlIHRyYWR1Y2UgdGFuIGRpcmVjdGFtZW50ZSBlbiBkZXNhcnJvbGxvIHR1csOtc3RpY28gYWxsw60g4oCUcG9zaWJsZW1lbnRlIHBvciBmYWx0YSBkZSBpbmZyYWVzdHJ1Y3R1cmEgbyBlbmZvcXVlIGVjb27Ds21pY28gZGlzdGludG8uCgoKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgTWFwYSAyOiBSwrIgbG9jYWwgZGVsIG1vZGVsbyBHV1IKdG1fc2hhcGUoZGZfbWFwYSkgKwogIHRtX3BvbHlnb25zKCJsb2NhbF9SMiIsIHBhbGV0dGUgPSAiT3JhbmdlcyIsIHRpdGxlID0gIlLCsiBMb2NhbCIpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiQm9uZGFkIGRlIGFqdXN0ZSBkZWwgbW9kZWxvIEdXUiBwb3IgZXN0YWRvIikKYGBgCgoKCkVzdGUgbWFwYSBpbmRpY2EgcXXDqSB0YW4gYmllbiBleHBsaWNhIGVsIG1vZGVsbyBHV1IgbGEgdmFyaWFiaWxpZGFkIGRlbCBQSUIgdHVyw61zdGljbyBlbiBjYWRhIGVzdGFkby4gRXMgZGVjaXIsIG1pZGUgbGEgY2FwYWNpZGFkIGV4cGxpY2F0aXZhIGRlbCBtb2RlbG8gZW4gZWwgZXNwYWNpby4KCi1Db2xvcmVzIG9zY3Vyb3MvbmFyYW5qYXMgaW50ZW5zb3M6IHJlZmxlamFuIHZhbG9yZXMgZGUgUsKyIGxvY2FsZXMgYWx0b3MgKG1heW9yIGFqdXN0ZSksIGVzIGRlY2lyLCBlbiBlc29zIGVzdGFkb3MgZWwgbW9kZWxvIGV4cGxpY2EgZ3JhbiBwYXJ0ZSBkZWwgUElCIHR1csOtc3RpY28uCi1Db2xvcmVzIGNsYXJvcyBvIGFtYXJpbGxvczogbXVlc3RyYW4gdW4gbWVub3IgYWp1c3RlIGxvY2FsIGRlbCBtb2RlbG8uCgpFbCBtb2RlbG8gR1dSIGZ1bmNpb25hIG11eSBiaWVuIGVuIGNpZXJ0YXMgcmVnaW9uZXMsIGNvbW8gZWwgY2VudHJvIHkgb2NjaWRlbnRlIGRlbCBwYcOtcywgZG9uZGUgcHVlZGUgY2FwdGFyIHJlbGFjaW9uZXMgbcOhcyBjbGFyYXMgZW50cmUgbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgeSBlbCB0dXJpc21vLgoKRW4gcmVnaW9uZXMgY29uIG1lbm9yIFLCsiAocG9yIGVqZW1wbG8sIGFsZ3VuYXMgem9uYXMgZGVsIHN1ciksIHBvZHLDrWFuIGVzdGFyIGluZmx1eWVuZG8gZmFjdG9yZXMgbm8gaW5jbHVpZG9zIGVuIGVsIG1vZGVsbyAoY29tbyBpbnNlZ3VyaWRhZCwgY29uZWN0aXZpZGFkIG8gY29uZGljaW9uZXMgbmF0dXJhbGVzKS4KCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIE1hcGEgMzogQXV0b2NvcnJlbGFjacOzbiBkZSByZXNpZHVvcyBkZWwgbW9kZWxvIFNETQpyZXNpZHVvc19zZG0gPC0gcmVzaWR1YWxzKG1vZGVsb19zZG0pCmRmX21hcGEkcmVzaWR1b3Nfc2RtIDwtIHJlc2lkdW9zX3NkbQoKdG1fc2hhcGUoZGZfbWFwYSkgKwogIHRtX3BvbHlnb25zKCJyZXNpZHVvc19zZG0iLCBwYWxldHRlID0gIi1SZEJ1IiwgbWlkcG9pbnQgPSAwLAogICAgICAgICAgICAgIHRpdGxlID0gIlJlc2lkdW9zIGRlbCBtb2RlbG8gU0RNIikgKwogIHRtX2xheW91dCh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGVzcGFjaWFsIGRlIHJlc2lkdW9zIChTRE0pIikKCmBgYAoKCgpFc3RlIG1hcGEgcHJlc2VudGEgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcmVzaWR1b3MgZGVsIG1vZGVsbyBTRE0sIGVzIGRlY2lyLCBsYXMgZGlmZXJlbmNpYXMgZW50cmUgbG8gb2JzZXJ2YWRvIHkgbG8gcHJlZGljaG8uIEF5dWRhIGEgZGV0ZWN0YXIgcGF0cm9uZXMgZXNwYWNpYWxlcyBubyBjYXB0YWRvcyBwb3IgZWwgbW9kZWxvLgoKCi0gQ29sb3JlcyByb2pvczogaW5kaWNhbiByZXNpZHVvcyBwb3NpdGl2b3M9IGVsIG1vZGVsbyBzdWJlc3RpbcOzIGVsIFBJQiB0dXLDrXN0aWNvIGVuIGVzYXMgcmVnaW9uZXMuCi0gQ29sb3JlcyBhenVsZXM6IGluZGljYW4gcmVzaWR1b3MgbmVnYXRpdm9zPSBlbCBtb2RlbG8gc29icmVlc3RpbcOzIGVsIFBJQiB0dXLDrXN0aWNvLgotIERpc3RyaWJ1Y2lvbmVzIGFncnVwYWRhcyBkZSB1biBtaXNtbyBjb2xvcj0gcG9kcsOtYW4gc2XDsWFsYXIgYXV0b2NvcnJlbGFjacOzbiBlc3BhY2lhbCByZXNpZHVhbC4KClNpIGxvcyBlcnJvcmVzIGVzdMOhbiBkaXN0cmlidWlkb3MgZGUgZm9ybWEgYWxlYXRvcmlhLCBlbCBtb2RlbG8gU0RNIGNhcHR1cmEgYmllbiBsYXMgcmVsYWNpb25lcyBlc3BhY2lhbGVzLgoKU2kgaGF5IGFncnVwYWNpb25lcyBkZSBlcnJvcmVzIHNpbWlsYXJlcyAoY2x1c3RlcnMpLCBlc3BlY2lhbG1lbnRlIGVuIHpvbmFzIGVzcGVjw61maWNhcyAoY29tbyBlbCBzdXItc3VyZXN0ZSksIHN1Z2llcmUgcXVlIGhheSBkaW7DoW1pY2FzIGxvY2FsZXMgbm8gbW9kZWxhZGFzIGFkZWN1YWRhbWVudGUuIEVzdG8gcG9kcsOtYSBqdXN0aWZpY2FyIGluY29ycG9yYXIgdmFyaWFibGVzIGFkaWNpb25hbGVzIG8gY29uc2lkZXJhciB1biBtb2RlbG8gYcO6biBtw6FzIGxvY2FsLgoKCiMgQ29uY2x1c2nDs24KLSBFbCBtb2RlbG8gR1dSIHBlcm1pdGUgdmlzdWFsaXphciBxdcOpIHZhcmlhYmxlcyBleHBsaWNhbiBtZWpvciBlbCB0dXJpc21vIGVuIGNhZGEgcmVnacOzbiwgw7p0aWwgcGFyYSBkaXNlw7FhciBwb2zDrXRpY2FzIHDDumJsaWNhcyByZWdpb25hbGl6YWRhcy4KLSBMYSBlZHVjYWNpw7NuIHVuaXZlcnNpdGFyaWEgZXMgdW4gZnVlcnRlIG1vdG9yIGRlbCB0dXJpc21vIGVuIHpvbmFzIHVyYmFuYXMgZGVzYXJyb2xsYWRhcywgcGVybyBubyBlcyBzdWZpY2llbnRlIGVuIHJlZ2lvbmVzIG3DoXMgbWFyZ2luYWRhcy4KLSBFbCBhanVzdGUgZGVsIG1vZGVsbyB2YXLDrWEsIHkgc2UgcmVxdWllcmVuIGVuZm9xdWVzIGRpc3RpbnRvcyBzZWfDum4gbGEgem9uYSAocG9yIGVqZW1wbG8sIGludmVyc2nDs24gZW4gZWR1Y2FjacOzbiB2cy4gaW5mcmFlc3RydWN0dXJhKS4KLSBBdW5xdWUgZWwgU0RNIHJlZHVjZSBsYSBhdXRvY29ycmVsYWNpw7NuLCB0b2RhdsOtYSBoYXkgcGF0cm9uZXMgZXNwYWNpYWxlcyBubyBleHBsaWNhZG9zIGVuIGFsZ3VuYXMgcmVnaW9uZXMsIGxvIHF1ZSB2YWxpZGEgbGEgdXRpbGlkYWQgZGUgbW9kZWxvcyBsb2NhbGVzIGNvbW8gR1dSLgoKCg==