Reclaaciones y Edad (Pawitan). Una copañía aseguradora quiere conocer cóo depende el núero de reclaaciones de los clientes con cierta póliza, de su edad. El archivo reclaaciones.txt contiene los datos de edad en años y núero de reclaaciones efectuadas durante el últio año por los 153 clientes con la citada póliza. Ajusta un odelo log-lineal de poisson. Interpreta y valora el ajuste del odelo. Estia el núero edio de reclaaciones de los individuos de 50 años. Estia la edad de los individuos que presentan 3 reclaaciones. > datos <- read.table("d:\\...\\reclaaciones.txt", header=t) > datos[1:5, ] edad reclaa 1 41 1 2 44 3 3 45 1 > x <- datos$edad ### edad > y <- datos$reclaa ### nº de reclaaciones > n <- length( x ) > n [1] 153 > options(digits=4) Núero edio de reclaaciones: > <- ean(y) > [1] 1.745 > y.factor <- as.factor(y) > levels(y.factor) [1] "0" "1" "2" "3" "4" "5" "6" "7" "8" > table(y.factor) y.factor 0 1 2 3 4 5 6 7 8 28 53 35 20 8 5 2 1 1 La distribución de Poisson es de tipo exponencial con paráetro dispersión 1. 1
Edad edia de los clientes: > x <- ean(x) > x [1] 45.29 > x.factor <- as.factor(x) > anios <- as.nueric( levels(x.factor) ) Núero edio de reclaaciones en cada grupo de edad: > y.full <- tapply( y, x.factor, ean ) > y.full 33 34 35 37 38 39 40 41 42 43 44 1.0000 1.0000 0.6667 1.0000 0.3333 1.8889 1.5000 1.8182 1.2500 0.9167 1.0000 45 46 47 48 49 50 51 52 53 54 55 1.5000 1.8421 1.6667 1.5455 2.4000 2.6000 2.2222 1.4000 4.0000 3.3333 4.5000 56 60 3.0000 6.0000 > ### gráfico con los datos ### > x11() > plot( x, y+runif(n,0,0.2), xlab="edad", ylab="reclaaciones" ) > ### añade las edias de los distintos grupos de edad ### > lines( anios, y.full, type="b", lty=3, pch="", cex=0.7 ) > ### edia global del odelo nulo ### > abline( h =, lty=3 ) ### =ean(y) > ### añade la recta de regresión ### > abline( lsfit(x,y)$coef, lty=3 ) reclaaciones 0 2 4 6 8 35 40 45 50 55 60 EDAD 2
Ajuste de un odelo Poisson log-lineal logverosiilitud: Score: Eleento (j,k) de la inforación observada: Matriz de inforación de Fisher y covarianza asintótica de los EMV de los beta: Interpretación del odelo: es la respuesta edia de los individuos que valen 0 en todas las variables explicativas. 3
En nuestro ejeplo, considerareos la variable explicativa edad centrada para reducir la correlación de los estiadores del predictor lineal. > xc <- x-x > xc <- gl( y ~ xc, faily=poisson ) > suary( xc ) Call: gl(forula = y ~ xc, faily = poisson) Deviance Residuals: Min 1Q Median 3Q Max -2.266-0.689-0.237 0.472 3.566 Coefficients: Estiate Std. Error z value Pr(> z ) (Intercept) 0.5074 0.0641 7.91 2.6e-15 *** xc 0.0650 0.0126 5.15 2.7e-07 *** (Dispersion paraeter for poisson faily taken to be 1) Null deviance: 204.25 on 152 degrees of freedo Residual deviance: 177.81 on 151 degrees of freedo AIC: 497.7 Nuber of Fisher Scoring iterations: 5 > b0 <- as.nueric( xc$coef[1] ) > b1 <- as.nueric( xc$coef[2] ) > y.fun <- function( x ) { exp(b0+b1*(x-x)) } ### edad x > curve(y.fun, add=t, lwd=2, col="blue") > confint( xc ) Waiting for profiling to be done... 2.5 % 97.5 % (Intercept) 0.37878 0.6304 xc 0.04021 0.0897 > cov.b <- vcov( xc ) > corb0b1 <- cov.b[1,2]/sqrt(cov.b[1,1]*cov.b[2,2]) > corb0b1 [1] -0.2996 ### sería -0.9947 con la edad no centrada 4
Cuál es el núero edio de reclaaciones de los clientes de 50 años? > ### edia de reclaaciones a edad 50: y50 > alfa <- 0.05; confianza <- 1-alfa > x50 <- 50 > eta50 <- b0+b1*(x50-x) ### predictor lineal > y50 <- exp( eta50 ) ### edia estiada > se.eta50 <- sqrt( cov.b[1,1]+2*(x50-x)*cov.b[1,2]+cov.b[2,2]*(x50-x)^2 ) > inf.y50 <- exp( eta50 - qnor(1-alfa/2)*se.eta50 ) > sup.y50 <- exp( eta50 + qnor(1-alfa/2)*se.eta50 ) > cbind( x50, y50, inf.y50, sup.y50, eta50, se.eta50, confianza ) x50 y50 inf.y50 sup.y50 eta50 se.eta50 confianza [1,] 50 2.255 1.954 2.603 0.8131 0.07321 0.95 5
De qué edad son los clientes que presentan 3 reclaaciones anuales? Método delta: Denotareos por ra el nº de reclaaciones y por xra la edad asociada > ra <- 3 > xra <- as.nueric( ((log(ra)-b0)/b1) + x ) ### x = ean(x) > dxra <- as.nueric( c(-1/b1, (b0-log(ra))/b1^2) ) ### derivadas de xra respecto betas > se.xra <- as.nueric( sqrt( dxra%*%cov.b%*%dxra ) ) ### étodo delta > ic.inf.xra <- xra - qnor(1-alfa/2)*se.xra > ic.sup.xra <- xra + qnor(1-alfa/2)*se.xra > cbind( ra, xra, se.xra, ic.inf.xra, ic.sup.xra, confianza ) ra xra se.xra ic.inf.xra ic.sup.xra confianza [1,] 3 54.39 1.748 50.97 57.82 0.95 6
Gráfico con los datos, el odelo ajustado y los intervalos calculados: > x11() > plot( x, y+runif(n,-0.1,0.1), xlab="edad", ylab= "reclaaciones", + ain="odelo log-lineal de poisson", cex.ain=0.9 ) > lines( anios, y.full, type="b", lty=1, pch="", cex=0.7 ) > curve( y.fun, lwd=2, col="blue", add=t ) > abline( v=x50, lty=3 ) > segents( x50, inf.y50, x50, sup.y50, lwd=3, col="blue" ) > abline( h=ra, lty=3 ) > segents( ic.inf.xra, ra, ic.sup.xra, ra, lwd=3, col="blue" ) odelo log-lineal de poisson reclaaciones 0 2 4 6 8 35 40 45 50 55 60 EDAD 7
Y si consideraos los datos agrupados por edades? > yg <- y.full ### edias en los grupos de edad de anios > ni <- tapply( y, x.factor, length ) > <- length( yg ) > [1] 24 Los datos en los 24 grupos de edad: > cbind( yg, anios, ni ) yg anios ni 33 1.0000 33 1 34 1.0000 34 1 35 0.6667 35 3 37 1.0000 37 3 38 0.3333 38 3 39 1.8889 39 9 40 1.5000 40 2 41 1.8182 41 11 42 1.2500 42 12 43 0.9167 43 12 44 1.0000 44 7 45 1.5000 45 12 46 1.8421 46 19 47 1.6667 47 9 48 1.5455 48 11 49 2.4000 49 5 50 2.6000 50 10 51 2.2222 51 9 52 1.4000 52 5 53 4.0000 53 2 54 3.3333 54 3 55 4.5000 55 2 56 3.0000 56 1 60 6.0000 60 1 Deviance para coparar dos odelos anidados: 8
Ajuste del odelo con los datos agrupados: > anios0 <- anios-x ### años centrados > g0 <- gl( yg ~ anios0, faily=poisson, weights=ni ) Hubo 17 avisos (use warnings() para verlos) > suary(g0) Call: gl(forula = yg ~ anios0, faily = poisson, weights = ni) Deviance Residuals: Min 1Q Median 3Q Max -1.785-0.376 0.136 0.501 2.034 Coefficients: Estiate Std. Error z value Pr(> z ) (Intercept) 0.5074 0.0641 7.91 2.6e-15 *** anios0 0.0650 0.0126 5.15 2.7e-07 *** (Dispersion paraeter for poisson faily taken to be 1) Null deviance: 47.855 on 23 degrees of freedo Residual deviance: 21.422 on 22 degrees of freedo AIC: Inf Nuber of Fisher Scoring iterations: 4 > vcov( g0 ) ### igual que xc (Intercept) anios0 (Intercept) 0.0041146-0.0002426 anios0-0.0002426 0.0001593 Ajuste del odelo log-lineal de Poisson con SAS options linesize=132 pagesize=500; data A; infile 'D:\...\reclaaciones.txt'; input edad reclaa; run; proc eans data=a; var _ALL_; run; data B; set A; eda0 = edad - 45.294; proc genod data=b; odel reclaa = eda0 / dist=poi link=log type1 type3 corrb lrci waldci; output out=sal_reclaa pred=predicho xbeta=xbeta lower=inf_pre upper=sup_pre; run; Resultado de PROC MEANS: Procediiento MEANS Variable N Media Dev tip Mínio Máxio ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ edad 153 45.2941176 4.8488772 33.0000000 60.0000000 reclaa 153 1.7450980 1.5066930 0 8.0000000 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 9
Resultados de PROC GENMOD, ajustando el odelo con la variable edad centrada: Procediiento GENMOD Inforación del odelo Conjunto de datos Distribución Función de vínculo Variable dependiente WORK.B Poisson Log reclaa Núero de observaciones leídas 153 Núero de observaciones usadas 153 Inforación del paráetro Paráetro Pr1 Pr2 Efecto Intercept eda0 Criterios para valorar la bondad de ajuste Criterio DF Valor Valor/DF Desviación 151 177.8148 1.1776 Desviación escalada 151 177.8148 1.1776 Chi-cuadrado de Pearson 151 165.0851 1.0933 Pearson X2 escalado 151 165.0851 1.0933 Verosiilitud log -105.1150 Verosiilitud log copleta -246.8605 AIC (ejor ás pequeño) 497.7209 AICC (ejor ás pequeño) 497.8009 BIC (ejor ás pequeño) 503.7818 Algorito convergido. Matriz de correlación estiada Pr1 Pr2 Pr1 1.0000-0.2996 Pr2-0.2996 1.0000 Análisis de estiadores de paráetros de áxia verosiilitud Cociente de verosiilitud Error Wald 95% Líites 95% Líites Chi-cuadrado Paráetro DF Estiador estándar de confianza de confianza de Wald Pr > ChiSq Intercept 1 0.5074 0.0641 0.3817 0.6331 0.3788 0.6304 62.57 <.0001 eda0 1 0.0650 0.0126 0.0402 0.0897 0.0402 0.0897 26.49 <.0001 Escal 0 1.0000 0.0000 1.0000 1.0000 1.0000 1.0000 NOTE: El paráetro de escala se ha antenido fijo. Estadísticos LR para análisis tipo 1 Chi- Fuente Desvianza DF cuadrado Pr > ChiSq Intercept 204.2479 eda0 177.8148 1 26.43 <.0001 Estadísticos LR para análisis de tipo 3 Chi- Fuente DF cuadrado Pr > ChiSq eda0 1 26.43 <.0001 10
> ###### BOOTSTRAP sobre la uestra (x, y) ####### > datos <- read.table("d:\\...\\reclaaciones.txt", header=t) > x <- datos$edad > y <- datos$reclaa > n <- length( x ) > x <- ean(x) > xc <- x-x >.gl <- gl( y ~ xc, faily=poisson ) > b0 <-.gl$coef[1] > b1 <-.gl$coef[2] > cbind(b0, b1) b0 b1 (Intercept) 0.5074104 0.06496521 > yhat <- exp( b0+b1*xc ) > resid <- y-yhat > B <- 1000 > b0.star <- NULL > b1.star <- NULL > for(i in 1:B ) { + subind <- saple(1:n, n, replace=t) + xc.star <- xc[subind]-ean(xc[subind]) + y.star <- y[subind] + od.aux <- gl( y.star ~ xc.star, faily=poisson ) + b0.star[i] <- od.aux$coef[1] + b1.star[i] <- od.aux$coef[2] + } > se.b0.boot <- sd(b0.star) > se.b1.boot <- sd(b1.star) > cor.b0b1.boot <- cor(b0.star, b1.star) > cbind(b0, se.b0.boot, b1, se.b1.boot, cor.b0b1.boot) b0 se.b0.boot b1 se.b1.boot cor.b0b1.boot (Intercept) 0.5074104 0.07066664 0.06496521 0.01256385-0.1651500 > quantile(b0.star, c(0.025, 0.05, 0.5, 0.95, 0.975)) 2.5% 5% 50% 95% 97.5% 0.3723206 0.3894230 0.5075092 0.6279541 0.6487079 > quantile(b1.star, c(0.025, 0.05, 0.5, 0.95, 0.975)) 2.5% 5% 50% 95% 97.5% 0.03892173 0.04259206 0.06380534 0.08363559 0.08746904 > x11() > hist(b0.star, breaks=30, probability=t) > rug(quantile(b0.star, c(0.025, 0.05, 0.5, 0.95, 0.975))) > x11() > hist(b1.star, breaks=30, probability=t) > rug(quantile(b1.star, c(0.025, 0.05, 0.5, 0.95, 0.975))) > curve(dnor(x,b1,se.b1.boot), add=t) > lines(density(b1.star), lty=3) 11
Histogra of b0.star Density 0 1 2 3 4 5 6 0.3 0.4 0.5 0.6 0.7 b0.star Histogra of b1.star Density 0 5 10 15 20 25 30 0.02 0.04 0.06 0.08 0.10 b1.star 12