“All models are fiction, but some stories are better than others” - Richard Berk
“All models are wrong. We make tentative assumptions about the real world which we know are false but which we believe may be useful” - George Box
podría calcular un variograma para datos por areas?
podría emplearlo para hacer krigin?
Los resultados de una regresión por MCe proporcionan un resumen “global” de la relación entre las dos variables. La regresión ponderada geográficamente permite explorar cómo difieren las relaciones entre regiones.
Hay varios paquetes R para GWR. Estos incluyen spgwr, GWmodel y gwrr:
En este ejercicio, emplearemos spgwr. Para utilizar GWR, es necesario seleccionar un esquema de ponderación espacial (un kernel) que defina cuánto peso se le da a cada vecino de cada zona. El tamaño de un núcleo se indica por su ancho de banda - un ancho de banda pequeño significa que a los vecinos cercanos se les dan grandes pesos mientras que a los vecinos más distantes se les dan pesos mucho más pequeños. Con un mayor ancho de banda, los pesos están más `dispersos’ y no hay una disminución marcada de pesos con el aumento de la distancia.
El ancho de banda se puede seleccionar manualmente o se puede utilizar algún tipo de enfoque de optimización para seleccionar uno. Un posible enfoque es utilizar la validación cruzada. Esto implica eliminar cada observación por separado y estimar su valor utilizando los datos restantes. A continuación se calculan las diferencias entre los valores reales observados y los valores estimados. Este procedimiento se completa para anchos de banda múltiples y el ancho de banda que corresponde al error general más pequeño se considera óptimo. El ancho de banda identificado de esta manera se utiliza para el ajuste del modelo GWR.
## el codigo de departamento esta mal para la base 17
library(foreign)
nofetales17<-read.spss("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/nofetal2017/nofetal2017.sav",to.data.frame = TRUE)
nofetales16<-read.spss("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/nofetal2017/nofetal2017.sav",to.data.frame = TRUE)
correla667<-read.csv("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/correlativa667.csv")
names(nofetales17)<-tolower(names(nofetales17))
# names(defun_avpp13)
# table(defun_avpp13$ops_un_digito)
# names(nofetales17)[names(nofetales17)=="cod_munic"]<-"cod_mpio"
nofetales17$cod_mpio<-paste0(nofetales17$cod_dpto,nofetales17$cod_mpio)
# defun_avpp_neoplasia<-defun_avpp13[defun_avpp13$ops_un_digito==1,]
library(tidyverse)
library(readxl)
nofetales667<-left_join(nofetales17,correla667)
# defun_avpp13$ops_tres_digitos<-as.numeric(defun_avpp13$ops_desc_tres_digitos)
base<-nofetales667 %>%
#filter(ops_un_digito==5)%>%
group_by(cod_mpio,ops_desc_un_digito)%>%
#group_by(cod_mpio,ops_tres_digitos)%>%
summarise(
n=n())
base_rs<-reshape(data.frame(base), idvar = "cod_mpio", timevar = "ops_desc_un_digito", direction = "wide")
base_rs[is.na(base_rs)]<-0
pob<-read_xls("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/Datos 2015/poblacion2013.xls",sheet = 1)
base<-merge(base_rs, pob, by="cod_mpio")
write.csv(x = base,"D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/Datos 2015/667pob.csv")library(tidyverse)
pob667<-read.csv("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/Datos 2015/667pobrename.csv")
desempeno<-read.csv("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/Datos 2015/Desempeno municipal mapa.csv")
base<-left_join(desempeno,pob667)
base[is.na(base)]<-0
write.csv(base,"D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/Datos 2015/Desempeno+667.csv")| mpio-dpto | mpio-dpto |
|---|---|
| Municipio | Municipio |
| Codigo | Codigo |
| Departamento | Departamento |
| Grupo dotaciones | GrDota |
| Categoria de ruralidad | Categoria de ruralidad |
| Educación - Cobertura media neta | ECobeMedNet |
| Educación - SABER 11 Matematicas | ESABEMATE |
| Educación - SABER 11 Lenguaje | ESABELeng |
| Educación - Cobertura Transición | ECoberTrans |
| Salud - Cobertura salud | Scobert |
| Salud - Vacunación Pentavalente | SVacunPenta |
| Salud - Mortalidad Infantil | SMortaInf |
| Servicios públicos - Cobertura eléctrica rural | SPCoberElectrica |
| Servicios públicos - Cobertura internet | SPCoberInter |
| Servicios públicos - Cobertura Acueducto | SPCoberAcued |
| Servicios públicos - Cobertura Alcantarillado | SPCoberAlcanta |
| Seguridad - Hurtos x 10000 hab | SegHurto |
| Seguridad - Homicidios x 10000 hab | SegHomici |
| Seguridad - Violencia Intrafamiliar x 10000 hab | SegVioIntraF |
| Ingresos tributarios y no tributarios per cápita | Ingresos |
| Desempeno Municipal | Desempeno |
| n.CAUSAS EXTERNAS | MortaExterna |
| n.CIERTAS AFECCIONES ORIGINADA EN EL PERIODO PERINATAL | MortaPeri |
| n.ENFERMEDADES DEL SISTEMA CIRCULATORIO | MortaCircula |
| n.ENFERMEDADES TRANSMISIBLES | MortaTransmiso |
| n.NEOPLASIAS (TUMORES) | MortaTumores |
| n.SINTOMAS, SIGNOS Y AFECCIONES MAL DEFINIDAS | MortaMalDefini |
| n.TODAS LAS DEMAS CAUSAS | MortaDemasCaus |
| poblacion | poblacion |
# install.packages("spgwr")
library(sp)
library("spgwr")## 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'))`
## NOTE: This package does not constitute approval of GWR
## as a method of spatial analysis; see example(gwr)
library(maptools)## Checking rgeos availability: TRUE
library(lattice)
mpio <- readShapePoly("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/00. Datos/shp/mpio_desempeno_667 sin islas.shp")## Warning: readShapePoly is deprecated; use rgdal::readOGR or sf::st_read
## Field name: 'Desempeno+' changed to: 'Desempeno.'
names(mpio)## [1] "AREA" "PERIMETER" "MUNIPIOS_" "MUNIPIOS_I" "CODIGO"
## [6] "MPIOS" "ID" "NOMBRE" "DPTO" "X_COORD"
## [11] "Y_COORD" "cod_mpio" "Desempeno." "Desempen_1" "Desempen_2"
## [16] "Desempen_3" "Desempen_4" "Desempen_5" "Desempen_6" "Desempen_7"
## [21] "Desempen_8" "Desempen_9" "Desempen10" "Desempen11" "Desempen12"
## [26] "Desempen13" "Desempen14" "Desempen15" "Desempen16" "Desempen17"
## [31] "Desempen18" "Desempen19" "Desempen20" "Desempen21" "Desempen22"
## [36] "Desempen23" "Desempen24" "Desempen25" "Desempen26" "Desempen27"
## [41] "Desempen28" "Desempen29" "Desempen30"
names(mpio@data)<-c("AREA", "PERIMETER", "MUNIPIOS_", "MUNIPIOS_I", "CODIGO", "MPIOS",
"ID", "NOMBRE", "DPTO", "X_COORD", "Y_COORD", "cod_mpio","mpio.dpto", "Municipio","Departamento", "GrDota",
"Categoria.de.ruralidad", "ECobeMedNet", "ESABEMATE", "ESABELeng",
"ECoberTrans", "Scobert", "SVacunPenta", "SMortaInf", "SPCoberElectrica",
"SPCoberInter", "SPCoberAcued", "SPCoberAlcanta", "SegHurto",
"SegHomici", "SegVioIntraF", "Ingresos", "Desempeno", "MortaExterna",
"MortaPeri", "MortaCircula", "MortaTransmiso", "MortaTumores",
"MortaMalDefini", "MortaDemasCaus", "DPMP", "MPIO", "poblacion"
)
mpio$TMortaExterna<-mpio$MortaExterna/mpio$poblacion
mpio@data[is.na(mpio@data)]<-0## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
## Warning in `[<-.factor`(`*tmp*`, thisvar, value = 0): invalid factor level,
## NA generated
table(is.na(mpio@data))##
## FALSE TRUE
## 46369 975
summary(mpio@data)## AREA PERIMETER MUNIPIOS_ MUNIPIOS_I
## Min. :1.586e+07 Min. : 0.1407 Min. : 2.0 Min. : 1.0
## 1st Qu.:1.353e+08 1st Qu.: 0.4790 1st Qu.: 274.8 1st Qu.: 267.8
## Median :2.917e+08 Median : 0.7474 Median : 543.5 Median : 529.5
## Mean :1.064e+09 Mean : 1.1298 Mean : 543.5 Mean : 529.6
## 3rd Qu.:7.049e+08 3rd Qu.: 1.2148 3rd Qu.: 812.2 3rd Qu.: 792.2
## Max. :4.970e+10 Max. :14.9305 Max. :1081.0 Max. :1060.0
##
## CODIGO MPIOS ID NOMBRE
## 13667000000000: 2 05001 : 1 216 : 2 BOLIVAR : 4
## 05001000000000: 1 05002 : 1 001 : 1 BUENAVISTA: 4
## 05002000000000: 1 05004 : 1 002 : 1 LA UNION : 4
## 05004000000000: 1 05021 : 1 003 : 1 VILLANUEVA: 4
## 05021000000000: 1 05030 : 1 004 : 1 ARGELIA : 3
## 05030000000000: 1 05031 : 1 (Other):209 CORDOBA : 3
## (Other) :1069 (Other):1070 NA's :861 (Other) :1054
## DPTO X_COORD Y_COORD cod_mpio
## 05 :124 Min. :-78.83 Min. :-4.190 Min. : 5001
## 15 :123 1st Qu.:-75.78 1st Qu.: 4.247 1st Qu.:15629
## 25 :115 Median :-74.75 Median : 5.500 Median :25802
## 68 : 87 Mean :-74.62 Mean : 5.557 Mean :38705
## 52 : 62 3rd Qu.:-73.44 3rd Qu.: 6.925 3rd Qu.:67016
## 73 : 46 Max. :-66.94 Max. :11.740 Max. :99773
## (Other):519
## mpio.dpto Municipio Departamento
## ABEJORRAL-ANTIOQUIA : 1 BUENAVISTA: 4 ANTIOQUIA :124
## ABREGO-NORTE_DE_SANTANDER: 1 LA UNIÓN : 4 BOYACA :123
## ABRIAQUÃ\215-ANTIOQUIA : 1 VILLANUEVA: 4 CUNDINAMARCA:115
## ACACÃ\215AS-META : 1 ARGELIA : 3 SANTANDER : 87
## ACANDÃ\215-CHOCO : 1 BOLÃ\215VAR : 3 NARIÑO : 62
## (Other) :1052 (Other) :1039 (Other) :546
## NA's : 19 NA's : 19 NA's : 19
## GrDota Categoria.de.ruralidad ECobeMedNet
## C : 13 Ciudades y aglomeraciones:115 Min. :0.0000
## G1 :212 Intermedios :298 1st Qu.:0.3000
## G2 :211 Rural :357 Median :0.4000
## G3 :215 Rural disperso :287 Mean :0.3999
## G4 :209 NA's : 19 3rd Qu.:0.5000
## G5 :197 Max. :1.0000
## NA's: 19
## ESABEMATE ESABELeng ECoberTrans Scobert
## Min. : 0.00 Min. : 0.00 Min. :0.0000 Min. :0.0000
## 1st Qu.:44.58 1st Qu.:48.65 1st Qu.:0.4000 1st Qu.:0.6900
## Median :47.90 Median :50.95 Median :0.5100 Median :0.8200
## Mean :46.95 Mean :49.96 Mean :0.5121 Mean :0.7924
## 3rd Qu.:50.92 3rd Qu.:53.00 3rd Qu.:0.6200 3rd Qu.:0.9500
## Max. :59.60 Max. :59.09 Max. :1.0000 Max. :1.0000
##
## SVacunPenta SMortaInf SPCoberElectrica SPCoberInter
## Min. :0.0000 Min. : 0.00 Min. :0.0000 Min. :0.00000
## 1st Qu.:0.8500 1st Qu.:13.69 1st Qu.:0.8700 1st Qu.:0.00900
## Median :0.9300 Median :17.05 Median :0.9700 Median :0.02000
## Mean :0.9227 Mean :18.27 Mean :0.8769 Mean :0.03902
## 3rd Qu.:1.0100 3rd Qu.:21.30 3rd Qu.:0.9900 3rd Qu.:0.04600
## Max. :3.3900 Max. :64.70 Max. :1.0000 Max. :0.68600
##
## SPCoberAcued SPCoberAlcanta SegHurto SegHomici
## Min. :0.0000 Min. :0.0000 Min. : 0.000 Min. : 0.000
## 1st Qu.:0.3300 1st Qu.:0.1600 1st Qu.: 3.917 1st Qu.: 0.000
## Median :0.5600 Median :0.3300 Median : 8.955 Median : 1.505
## Mean :0.5604 Mean :0.3818 Mean : 15.412 Mean : 2.333
## 3rd Qu.:0.8100 3rd Qu.:0.5700 3rd Qu.: 19.465 3rd Qu.: 3.230
## Max. :1.0000 Max. :1.0000 Max. :157.710 Max. :27.270
##
## SegVioIntraF Ingresos Desempeno MortaExterna
## Min. : 0.00 Min. : 0 Min. : 0.00 Min. : 0.00
## 1st Qu.: 3.54 1st Qu.: 89592 1st Qu.:43.05 1st Qu.: 2.00
## Median : 8.16 Median :138929 Median :48.90 Median : 6.00
## Mean : 10.48 Mean :202347 Mean :48.36 Mean : 27.14
## 3rd Qu.: 14.26 3rd Qu.:254596 3rd Qu.:54.69 3rd Qu.: 16.00
## Max. :106.55 Max. :468923 Max. :83.24 Max. :3048.00
##
## MortaPeri MortaCircula MortaTransmiso MortaTumores
## Min. : 0.000 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.000 1st Qu.: 4.00 1st Qu.: 0.00 1st Qu.: 1.00
## Median : 0.000 Median : 10.00 Median : 1.00 Median : 3.00
## Mean : 3.566 Mean : 57.76 Mean : 12.91 Mean : 36.36
## 3rd Qu.: 0.000 3rd Qu.: 24.00 3rd Qu.: 2.00 3rd Qu.: 10.00
## Max. :672.000 Max. :9866.00 Max. :2010.00 Max. :8397.00
##
## MortaMalDefini MortaDemasCaus DPMP MPIO
## Min. : 0.000 Min. : 0.00 Min. : 0 NA : 6
## 1st Qu.: 0.000 1st Qu.: 2.00 1st Qu.:15462 Buenavista: 4
## Median : 1.000 Median : 5.00 Median :25595 La Unión : 4
## Mean : 3.494 Mean : 46.43 Mean :36852 Villanueva: 4
## 3rd Qu.: 2.000 3rd Qu.: 11.00 3rd Qu.:63227 Argelia : 3
## Max. :610.000 Max. :8519.00 Max. :99773 (Other) :1036
## NA's : 19
## poblacion TMortaExterna
## Min. : 0 Min. :0.0000000
## 1st Qu.: 6588 1st Qu.:0.0002244
## Median : 13302 Median :0.0004554
## Mean : 43045 Mean :0.0005428
## 3rd Qu.: 26367 3rd Qu.:0.0007620
## Max. :7674366 Max. :0.0028307
##
table(is.na(mpio@data$TMortaExterna))##
## FALSE
## 1076
table(is.na(mpio@data$SPCoberInter))##
## FALSE
## 1076
# Identify the optimal bandwidth using cross validation; the fixed bandwidth
# Gaussian function is used
bwG <- gwr.sel(TMortaExterna ~ SPCoberInter, data = mpio, gweight = gwr.Gauss, verbose = FALSE)
# View the selected bandwidth
bwG# Fit the GWR model using the bandwidth identified in the previous step
gwrG <- gwr(TMortaExterna ~ SPCoberInter, data = mpio, bandwidth = 50000, gweight = gwr.Gauss)
# Summarise the GWR outputs
summary(gwrG$SDF)## Object of class SpatialPolygonsDataFrame
## Coordinates:
## min max
## x 443770.49 1804280
## y 20565.69 1867933
## Is projected: NA
## proj4string : [NA]
## Data attributes:
## sum.w X.Intercept. SPCoberInter
## Min. : 1.021 Min. :-3.186e-05 Min. :-0.0081847
## 1st Qu.:23.228 1st Qu.: 3.291e-04 1st Qu.: 0.0003828
## Median :36.663 Median : 4.631e-04 Median : 0.0010650
## Mean :41.397 Mean : 4.837e-04 Mean : 0.0051739
## 3rd Qu.:58.467 3rd Qu.: 6.625e-04 3rd Qu.: 0.0023697
## Max. :94.108 Max. : 1.293e-03 Max. : 0.3719067
## gwr.e pred localR2
## Min. :-7.828e-04 Min. :-4.704e-07 Min. :-0.14027
## 1st Qu.:-2.041e-04 1st Qu.: 3.664e-04 1st Qu.: 0.08322
## Median :-3.131e-05 Median : 5.103e-04 Median : 0.11901
## Mean : 1.360e-05 Mean : 5.292e-04 Mean : 0.18262
## 3rd Qu.: 1.616e-04 3rd Qu.: 6.874e-04 3rd Qu.: 0.20070
## Max. : 1.933e-03 Max. : 2.016e-03 Max. : 1.00000
Por lo tanto, la distancia de ancho de banda identificada se pasa a bwG y esto se usa con el argumento de ancho de banda usando gwr. En su lugar, podría especificar manualmente un ancho de banda (por ejemplo, ‘ancho de banda = 20000.0’) y evitar el uso de gwr.sel.
Con GWR, se proporcionan coeficientes beta de regresión para cada ubicación de entrada y éstos pueden ser mapeados para que, por ejemplo, se puedan explorar las relaciones locales entre el desempleo y las enfermedades y discapacidades de larga duración.
# Now map the coefficients (the local slope values).
spplot(gwrG$SDF, "SPCoberInter", col = "transparent")# and the local r square values
spplot(gwrG$SDF, "localR2", col = "transparent")El término col=“transparent” evita que los bordes se muestren como líneas sólidas distintas.
Recuerde que el cuadrado r indica la bondad del ajuste. Por lo tanto, los valores mapeados cercanos a uno indican las ubicaciones en las que el modelo encaja bien.
El esquema de ponderación (gweight) puede ser cambiado; gwr.Gauss es un núcleo de ancho de banda fijo (por ejemplo, los pesos disminuyen a casi cero después de una distancia fija). En su lugar, puede usar r gwr.bisquare que es un núcleo de ancho variable - es pequeño donde hay una densidad de observaciones alta y grande donde la densidad de observaciones es baja.
Por lo tanto, en este caso, será pequeña en las zonas con mayor densidad de municipiosy grande en el caso contrario. Para aclarar, en el caso de gwr.Gauss se especifica una distancia mientras que para gwr.bisquare es el número de vecinos más cercanos. Por ejemplo, se podrían especificar 25 vecinos más cercanos para la plaza gwr.bis y la distancia de un municipio pequeño (junto a otros pequeños) a su vecino más cercano 25 será obviamente más pequeña que la distancia de un municipio grande (rodeado por otros grandes) rural a su vecino más cercano 25. En R, los vecinos más cercanos se expresan como una fracción de los datos totales (por ejemplo, un ancho de banda de 0,000909090 = unos 1 de 1100 puntos de datos; mientras que 1 representaría un vecindario que contiene todas las demás observaciones).
# Identify the optimal bandwidth using cross validation; an adaptive
# bandwidth bi-square function is used
ad.bw <- gwr.sel(TMortaExterna ~ SPCoberInter, data = mpio, adapt = TRUE)# Fit the GWR model using the bandwidth identified in the previous step
gwrAD <- gwr(TMortaExterna ~ SPCoberInter, data = mpio, adapt = 0.4, gweight = gwr.bisquare)
# Summarise the GWR outputs
summary(gwrAD$SDF)## Object of class SpatialPolygonsDataFrame
## Coordinates:
## min max
## x 443770.49 1804280
## y 20565.69 1867933
## Is projected: NA
## proj4string : [NA]
## Data attributes:
## sum.w X.Intercept. SPCoberInter
## Min. : 30.49 Min. :0.0003047 Min. :0.0002120
## 1st Qu.:150.91 1st Qu.:0.0003733 1st Qu.:0.0007381
## Median :168.45 Median :0.0004452 Median :0.0011228
## Mean :164.46 Mean :0.0004944 Mean :0.0013856
## 3rd Qu.:181.65 3rd Qu.:0.0006359 3rd Qu.:0.0018568
## Max. :217.84 Max. :0.0007128 Max. :0.0045747
## gwr.e pred localR2
## Min. :-6.981e-04 Min. :0.0003076 Min. :0.02654
## 1st Qu.:-2.678e-04 1st Qu.:0.0004094 1st Qu.:0.05816
## Median :-6.954e-05 Median :0.0005198 Median :0.07574
## Mean : 6.569e-06 Mean :0.0005362 Mean :0.09814
## 3rd Qu.: 1.899e-04 3rd Qu.:0.0006594 3rd Qu.:0.12220
## Max. : 2.199e-03 Max. :0.0010617 Max. :0.27936
spplot(gwrAD$SDF, "SPCoberInter", col = "transparent")spplot(gwrAD$SDF, "localR2", col = "transparent")Realice una regresión geograficamente ponderada por otras variables de su interés y comente.
Los modelos lineales generalizados (GLM) son una ampliación flexible de la regresión lineal ordinaria (modelo Normal lineal) que permite variables de respuesta que tienen modelos de distribución de errores distintos de una distribución normal.
El modelo de regresión normal lineal es muy popular para el análisis estadístico cuando la variable respuesta es continua, simetrica y de de varianza constante. La distribución normal posee propiedades estadísticas deseables y gran cantidad de teoria desarrollada. Sin embargo, cuando la variable respuesta es discreta, o cuando la variable respuesta es continua pero los supuestos de simetria y/o varianza constante no son razonables, el modelo normal lineal puede ser inadecuado. Como alternativa para el análisis surge una extensión del modelo normal lineal, llamada modelo lineal generalizado (MLG), la cual introduce gran flexibilidad tanto en la componente aleatoria como en la sistemática, permitiendo así, abordar una variedad más amplia de situaciones prácticas.
Al igual que en el modelo de regresión lineal, el supuesto de independencia entre la variable respuesta es fundamental. En el caso de suponer que los datos tienen una estructira de autocorrelación, por ejemplo temporal, es necesario recurrir a la prueba de Durbin Watson, en caso de que se rechase la hipotesis de que los datos esten autocorrelacionados, se procede a estimar el modelo normalmente, en caso contrario es necesario corregir la estructura de autocorrelación incorporandola al modelo.
Los datos con correlación espacial no son la excepción, primero deberemos diagnosticar la presencia de autocorrelaicón esparcial, si esta presente deberá incorporarse al modelo, en caso contrario, el modelo se estimará normalmente.
Un modelo lineal generalizado de Poisson es una forma de ajustar los datos de conteo a las variables explicativas. Se obtienen estimaciones de parámetros y errores estándar para las variables explicativas, y se pueden obtener valores ajustados y residuales.
La función glm() permite ajustar GLM con variable respuesta Poisson. Funciona igual que la función lm(), pero también se puede especificar un argumento de familia. La fórmula tiene el significado usual - respuesta a la izquierda del ~, y variables explicativas a la derecha.
Para hacer frente a los datos de conteo procedentes de poblaciones de diferentes tamaños, se especifica un argumento de desplazamiento o compensación (offset). En este caso se emplea el logaritmo de la población como término de compensación. Esto pues el número de casos depentde del tamaño de la población. En otras palabras en el offset del modelo se colocan los denominadores para modelar corregir el hecho de no estar modelando la tasa.
london<-readRDS("D:/DriveW7/2019/Sabana/Estadistica aplicada Salud Publica/Bibliografía/DataCamp Spatial Statistics in R/datasets/london_2017_2.rds", refhook = NULL)
# Fit a poisson GLM.
model_flu <- glm(
Flu_OBS ~ HealthDeprivation,
offset = log(TOTAL_POP),
data = london,
family = poisson)
# Is HealthDeprivation significant?
summary(model_flu)##
## Call:
## glm(formula = Flu_OBS ~ HealthDeprivation, family = poisson,
## data = london, offset = log(TOTAL_POP))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -9.5361 -4.5285 -0.0499 2.9043 8.2194
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.78190 0.02869 -306.043 <2e-16 ***
## HealthDeprivation 0.65689 0.06797 9.665 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 703.75 on 31 degrees of freedom
## Residual deviance: 605.03 on 30 degrees of freedom
## AIC: 762.37
##
## Number of Fisher Scoring iterations: 5
# Put residuals into the spatial data.
london$Flu_Resid <- residuals(model_flu)
# Map the residuals using spplot
spplot(london, "Flu_Resid")Las regiones en amarillo tenía muchos más casos de gripe de lo esperado; las que se encuentran en negro tenía muchos menos casos.
Un modelo lineal debe ajustarse a los datos y dejar residuos no correlacionados. Esto se aplica a los modelos no espaciales, en los que, por ejemplo, ajustar una línea recta a través de puntos en una curva daría lugar a residuos correlacionados en serie. Un modelo sobre datos espaciales debe tener como objetivo tener residuos que no muestren una correlación espacial significativa.
Puede probar el modelo ajustado a los datos de la gripe usando moran.mc() del paquete spdep.
# Compute the neighborhood structure.
library(spdep)## Loading required package: Matrix
borough_nb <- poly2nb(london)
# Test spatial correlation of the residuals.
moran.mc(london$Flu_Resid, listw = nb2listw(borough_nb), nsim = 999)##
## Monte-Carlo simulation of Moran I
##
## data: london$Flu_Resid
## weights: nb2listw(borough_nb)
## number of simulations + 1: 1000
##
## statistic = 0.15059, observed rank = 921, p-value = 0.079
## alternative hypothesis: greater
mp <- moran.plot(london$Flu_Resid, nb2listw(borough_nb), labels = as.character(london$NAME),
xlab = "residuos", ylab = "residuos rezagado")** Es deseable un valor p de menos de 0.05 para considerar que los residuos están espacialmente autocorrelacionados. En este caso, no hay suficiente evidencia en la prueba para tomar una decisión clara.**
Agregar un termino espacial al modelo.
\[Y=X\beta+S(x,y)\]
Hay varias formas de definir \(S(x,y)\), una es suponer que los datos de una región se distribuyen normalmente con media los vecinos y varianza por ser estimada. Es un modelo sencillo, con las ventajas de la distribución normal y solo un parámetro extra.
Se usan los metodos bayesianos dado lo costoso que es calcular la verosimilitud del modelo convencional.
La estimación bayesiana estima la función de distribución a posteriori del parámetro dada la muestra (evidencia), con la función de distribución se calculan los intervalos de credibilidad para el parámetro.
Si el intervalo de credibilidad no contiene el cero el parámetro es significativo para el modelo (análogo a la prueba t del modelo de regresión sobre cada beta distinto de cero)
Los modelos estadísticos bayesianos devuelven muestras de los parámetros de interés (la distribución “posterior”) basadas en alguna distribución “a priori”, supuesta para el parámetro, distribución que se actualiza con los datos. El proceso de modelado bayesiano devuelve un número de muestras a partir de las cuales se puede calcular la media, o una probabilidad de superación, o cualquier otra cantidad que se pueda calcular a partir de una distribución.
Antes de ajustar un modelo con correlación espacial, primero se ajustará el mismo modelo que antes, pero utilizando la inferencia bayesiana.
Repasar Clase Bayesiana
# Use R2BayesX
# install.packages("R2BayesX")
library(R2BayesX)## Loading required package: BayesXsrc
## Loading required package: colorspace
## Loading required package: mgcv
## Loading required package: nlme
## This is mgcv 1.8-27. For overview type 'help("mgcv-package")'.
# Fit a GLM
model_flu <- glm(Flu_OBS ~ HealthDeprivation, offset = log(TOTAL_POP),
data = london, family = poisson)
# Summarize it
summary(model_flu)##
## Call:
## glm(formula = Flu_OBS ~ HealthDeprivation, family = poisson,
## data = london, offset = log(TOTAL_POP))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -9.5361 -4.5285 -0.0499 2.9043 8.2194
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.78190 0.02869 -306.043 <2e-16 ***
## HealthDeprivation 0.65689 0.06797 9.665 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 703.75 on 31 degrees of freedom
## Residual deviance: 605.03 on 30 degrees of freedom
## AIC: 762.37
##
## Number of Fisher Scoring iterations: 5
# Calculate coeff confidence intervals
confint(model_flu)## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -8.838677 -8.7261843
## HealthDeprivation 0.524437 0.7908841
# Fit a Bayesian GLM
bayes_flu <- bayesx(Flu_OBS ~ HealthDeprivation, offset = log(london$TOTAL_POP),
family = "poisson", data = data.frame(london),
control = bayesx.control(seed = 17610407))
# Summarize it
summary(bayes_flu)## Call:
## bayesx(formula = Flu_OBS ~ HealthDeprivation, data = data.frame(london),
## offset = log(london$TOTAL_POP), control = bayesx.control(seed = 17610407),
## family = "poisson")
##
## Fixed effects estimation results:
##
## Parametric coefficients:
## Mean Sd 2.5% 50% 97.5%
## (Intercept) -8.7823 0.0278 -8.8363 -8.7828 -8.7271
## HealthDeprivation 0.6556 0.0686 0.5264 0.6578 0.7838
##
## N = 32 burnin = 2000 method = MCMC family = poisson
## iterations = 12000 step = 10
# Look at the samples from the Bayesian model
plot(samples(bayes_flu))Los coeficientes y sus intervalos de confianza son casi idénticos para los dos modelos. Esto es lo que se puede esperar, ya que en cada caso se utilizó la misma estructura de modelo. A continuación, verá cómo ampliar la versión bayesiana para incluir la correlación espacial.
Hemos ajustado un GLM no espacial usando el paquete R2BayesX. Ahora se incluirá un término correlacionado espacialmente basado en la estructura de adyacencia añadiendo un término a la fórmula que especifique un modelo correlacionado espacialmente.
# Compute adjacency objects
borough_nb <- poly2nb(london)
borough_gra <- nb2gra(borough_nb)
# Fit spatial model
flu_spatial <- bayesx(
Flu_OBS ~ HealthDeprivation + sx(i, bs = "spatial", map = borough_gra),
offset = log(london$TOTAL_POP),
family = "poisson", data = data.frame(london),
control = bayesx.control(seed = 17610407)
)## Note: created new output directory 'C:/Users/Daniel/AppData/Local/Temp/RtmpYh5AZ6/bayesx1'!
# Summarize the model
summary(flu_spatial)## Call:
## bayesx(formula = Flu_OBS ~ HealthDeprivation + sx(i, bs = "spatial",
## map = borough_gra), data = data.frame(london), offset = log(london$TOTAL_POP),
## control = bayesx.control(seed = 17610407), family = "poisson")
##
## Fixed effects estimation results:
##
## Parametric coefficients:
## Mean Sd 2.5% 50% 97.5%
## (Intercept) -9.1773 0.1244 -9.4220 -9.1692 -8.9655
## HealthDeprivation 1.1022 0.6408 -0.1566 1.1729 2.1644
##
## Smooth terms variances:
## Mean Sd 2.5% 50% 97.5% Min Max
## sx(i):mrf 4.9469 1.8225 2.2798 4.6614 9.3513 1.4965 16.746
##
## N = 32 burnin = 2000 method = MCMC family = poisson
## iterations = 12000 step = 10
Al igual que con glm, puede obtener los valores de ajuste y los residuos de su modelo utilizando las funciones fitted y residuals. Los modelos bayesx son un poco más complejos, ya que tiene el predictor lineal y los términos de los elementos \(sx\), como el término espacialmente correlacionado.
La función de resumen le mostrará información sobre los términos del modelo lineal y los términos de suavizado en dos tablas separadas. El término espacial se llama “sx(i):mrf”, que significa “Markov Random Field”.
El análisis bayesiano devuelve muestras de una distribución para nuestro término S(x) en cada uno de los municipios de Londres. La función de ajuste de modelos mediante bayesx proporciona un resumen estadístico de cada municipio.
# Summarize the model
summary(flu_spatial)## Call:
## bayesx(formula = Flu_OBS ~ HealthDeprivation + sx(i, bs = "spatial",
## map = borough_gra), data = data.frame(london), offset = log(london$TOTAL_POP),
## control = bayesx.control(seed = 17610407), family = "poisson")
##
## Fixed effects estimation results:
##
## Parametric coefficients:
## Mean Sd 2.5% 50% 97.5%
## (Intercept) -9.1773 0.1244 -9.4220 -9.1692 -8.9655
## HealthDeprivation 1.1022 0.6408 -0.1566 1.1729 2.1644
##
## Smooth terms variances:
## Mean Sd 2.5% 50% 97.5% Min Max
## sx(i):mrf 4.9469 1.8225 2.2798 4.6614 9.3513 1.4965 16.746
##
## N = 32 burnin = 2000 method = MCMC family = poisson
## iterations = 12000 step = 10
# Map the fitted spatial term only
london$spatial <- fitted(flu_spatial, term = "sx(i):mrf")[, "Mean"]
spplot(london, zcol = "spatial")# Map the residuals
london$spatial_resid <- residuals(flu_spatial)[, "mu"]
spplot(london, zcol = "spatial_resid")# Test residuals for spatial correlation
moran.mc(london$spatial_resid, nb2listw(borough_nb), 999)##
## Monte-Carlo simulation of Moran I
##
## data: london$spatial_resid
## weights: nb2listw(borough_nb)
## number of simulations + 1: 1000
##
## statistic = -0.27452, observed rank = 16, p-value = 0.984
## alternative hypothesis: greater
Con el p-valor no se rechaza la hipotesis nula de aleatoriedad espacial completa, con lo cual el modelo especifica la componente espacial.
library(spdep)
mp <- moran.plot(london$spatial_resid, nb2listw(borough_nb), labels = as.character(london$NAME),
xlab = "residuos", ylab = "residuos rezagado")Ajuste un GLM bayesiano con el dataset anterior y variables de su interes.
mpio@data$poblacion[mpio@data$poblacion==0]<-1
summary(mpio@data$poblacion)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 6588 13302 43045 26367 7674366
#str(mpio@data)
# Fit a poisson GLM.
model_flu <- glm(
MortaExterna ~ SPCoberInter,
offset = log(poblacion),
data = mpio@data,
family = poisson)
# Is HealthDeprivation significant?
summary(model_flu)##
## Call:
## glm(formula = MortaExterna ~ SPCoberInter, family = poisson,
## data = mpio@data, offset = log(poblacion))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -29.9584 -1.9278 -0.6338 0.7139 30.8163
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.42020 0.01074 -691.02 < 2e-16 ***
## SPCoberInter 0.38896 0.06777 5.74 9.48e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 8882.5 on 1075 degrees of freedom
## Residual deviance: 8849.5 on 1074 degrees of freedom
## AIC: 12640
##
## Number of Fisher Scoring iterations: 5
# Put residuals into the spatial data.
mpio$Flu_Resid <- residuals(model_flu)
# Map the residuals using spplot
spplot(mpio, "Flu_Resid", col = "transparent")# Compute the neighborhood structure.
library(spdep)
borough_nb <- poly2nb(mpio)
# Test spatial correlation of the residuals.
moran.mc(mpio$Flu_Resid, listw = nb2listw(borough_nb), nsim = 100)##
## Monte-Carlo simulation of Moran I
##
## data: mpio$Flu_Resid
## weights: nb2listw(borough_nb)
## number of simulations + 1: 101
##
## statistic = 0.2974, observed rank = 101, p-value = 0.009901
## alternative hypothesis: greater
mp <- moran.plot(mpio$Flu_Resid, nb2listw(borough_nb), labels = as.character(london$NAME),
xlab = "residuos", ylab = "residuos rezagado")Se rechaza la nula, por lo cual existe autocorrelación y es necesario incorporar dicha estructura al modelo.
“Statistics, the science of uncertainty, attempts to model order in disorder” - Noel Cressie