Opinión sobre Relaciones Sexuales Prematrimoniales y Control de Natalidad. En un estudio sobre control de natalidad en adolescentes se llevó a cabo una encuesta de la que se extraejeron los datos correspondientes a la variable PREMSEX: opinión sobre las relaciones sexuales prematrimoniales (codificada según: 1=siempre es un error, 2=casi siempre es un error, 3=sólo a veces es un error, 4=nunca es un error) y a la variable CNATALID: opinión sobre si los adolescentes deberían tener acceso a métodos de control de natalidad (codificada según: 1=fuerte desacuerdo, 2=desacuerdo, 3=acuerdo, 4=fuerte acuerdo). Los datos se presentan a continuación, en formato PREMSEX, CNATALID, FRECUENCIA: 1 1 3 1 81 18 1 2 3 2 68 41 1 3 60 3 3 74 1 4 38 3 4 42 2 1 4 1 24 36 2 2 4 2 26 57 2 3 29 4 3 161 2 4 14 4 4 157 ¿Cómo podemos explicar las relaciones entre ambas variables? > y <- c(81,68,60,38,24,26,29,14,18,41,74,42,36,57,161,157) > ps <- gl( 4, 4, length(y) ) ### premsex > cn <- gl( 4, 1, length(y) ) ### cnatalid > rbind( y, ps, cn ) y ps cn [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] 81 68 60 38 24 26 29 14 18 41 74 42 36 57 161 157 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 > ### tabla de contingencia 4*4 > tabla.y <- xtabs( y ~ ps + cn ) > addmargins( tabla.y ) cn ps 1 2 3 4 1 81 68 60 38 2 24 26 29 14 3 18 41 74 42 4 36 57 161 157 Sum 159 192 324 251 Sum 247 93 175 411 926 > summary( tabla.y ) ### test de independencia Call: xtabs(formula = y ~ ps + cn) Number of cases in table: 926 Number of factors: 2 Test for independence of all factors: Chisq = 128.68, df = 9, p-value = 2.212e-23 Se rechaza la independencia entre ambas variables. > > > > ### proporciones de la tabla ### p.filas <- prop.table( tabla.y, margin=1 ) p.col <- prop.table( tabla.y, margin=2 ) round( addmargins( prop.table( tabla.y ) ), 3 ) Proporciones totales: cn ps 1 2 3 1 0.087 0.073 0.065 2 0.026 0.028 0.031 3 0.019 0.044 0.080 4 0.039 0.062 0.174 Sum 0.172 0.207 0.350 4 0.041 0.015 0.045 0.170 0.271 Sum 0.267 0.100 0.189 0.444 1.000 1 4 3 2 > round( addmargins( p.filas ), 3 ) cn ps 1 2 3 4 Sum 1 0.328 0.275 0.243 0.154 1.000 2 0.258 0.280 0.312 0.151 1.000 3 0.103 0.234 0.423 0.240 1.000 4 0.088 0.139 0.392 0.382 1.000 Sum 0.776 0.928 1.369 0.926 4.000 1 opinión sobre relaciones sexuales prematrimoniales Proporciones por filas: 0.0 0.2 0.4 0.6 0.8 1.0 1.0 proporciones en 4 clases de cnatalid 0.6 0.0 0.2 Sum 1.200 0.432 0.722 1.646 4.000 0.4 3 ) proporciones en 4 clases de premsex > round( addmargins( p.col ), cn ps 1 2 3 4 1 0.509 0.354 0.185 0.151 2 0.151 0.135 0.090 0.056 3 0.113 0.214 0.228 0.167 4 0.226 0.297 0.497 0.625 Sum 1.000 1.000 1.000 1.000 0.8 Proporciones por columnas: 1 2 3 4 opinión sobre control de natalidad > > + + > > + + par(pty="s") barplot( t(p.filas), horiz=T, space=0.5, xlab="proporciones en 4 clases de cnatalid", ylab="opinión sobre relaciones sexuales prematrimoniales") x11() barplot( p.col, horiz=F, space=0.5, ylab="proporciones en 4 clases de premsex", xlab="opinión sobre control de natalidad") 2 > ### modelo de Asociación Uniforme ### > ps.num <- as.numeric( ps ) > cn.num <- as.numeric( cn ) > v <- ps.num*cn.num > m.AU <- glm( y ~ ps + cn + v, family=poisson (link=log) ) > summary( m.AU ) Call: glm(formula = y ~ ps + cn + v, family = poisson(link = log)) Deviance Residuals: Min 1Q -1.35834 -0.91606 Median 0.07972 3Q 0.61648 Coefficients: Estimate Std. Error z value (Intercept) 4.10684 0.08951 45.881 ps2 -1.64596 0.13473 -12.216 ps3 -1.77002 0.16464 -10.751 ps4 -1.75369 0.23432 -7.484 cn2 -0.46411 0.11952 -3.883 cn3 -0.72452 0.16201 -4.472 cn4 -1.87966 0.24910 -7.546 v 0.28584 0.02824 10.122 --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 Max 1.57618 Pr(>|z|) < 2e-16 < 2e-16 < 2e-16 7.20e-14 0.000103 7.74e-06 4.50e-14 < 2e-16 *** *** *** *** *** *** *** *** ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for poisson family taken to be 1) Null deviance: 431.078 Residual deviance: 11.534 AIC: 118.21 on 15 on 8 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 4 Test de juste del modelo m.AU: ¿Es lícito en este caso? > 1-pchisq( deviance(m.AU), m.AU$df.residual ) [1] 0.1732532 > anova( m.AU, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL ps cn v Df Deviance Resid. Df Resid. Dev 15 431.08 3 236.30 12 194.78 3 67.13 9 127.65 1 116.12 8 11.53 P(>|Chi|) 6.012e-51 1.759e-14 4.476e-27 El modelo de Asociación Uniforme ofrece un buen ajuste a la tabla observada. 3 > npar.AU <- length( m.AU$coef ) ### número de parámetros del modelo > vcoef <- m.AU$coef[npar.AU] > se.vcoef <- sqrt( vcov( m.AU )[npar.AU, npar.AU] ) > > > > > alfa <- 0.05; confianza <- 1-alfa; ### IC's de Wald y basados en la verosimilitud perfil ### v.ic.inf <- vcoef - qnorm(1-alfa/2)*se.vcoef v.ic.sup <- vcoef + qnorm(1-alfa/2)*se.vcoef round( cbind( vcoef, se.vcoef, v.ic.inf, v.ic.sup, confianza ), 4 ) vcoef se.vcoef v.ic.inf v.ic.sup confianza v 0.2858 0.0282 0.2305 0.3412 0.95 > v.ic.perfil <- as.numeric( confint( m.AU, parm = "v" ) ) Waiting for profiling to be done... > v.ic.perfil [1] 0.2313044 0.3420855 > > > > > ### bajo m.AU: OR de tabla 2*2 de elementos adyacentes e IC perfil ### ORadyacente <- exp( vcoef ) ORady.ic.inf <- exp( v.ic.perfil[1] ) ORady.ic.sup <- exp( v.ic.perfil[2] ) round( cbind( ORadyacente, ORady.ic.inf, ORady.ic.sup), 4 ) v ORadyacente ORady.ic.inf ORady.ic.sup 1.3309 1.2602 1.4079 > ### bajo m.AU: valores esperados estimados ### > predAU <- matrix( m.AU$fitted.values, 4, 4, byrow=T ) > round( addmargins( predAU ), 3 ) [,1] [,2] [,3] [,4] [,5] [1,] 80.857 67.654 69.396 29.094 247 [2,] 20.750 23.107 31.543 17.600 93 [3,] 24.394 36.152 65.681 48.773 175 [4,] 33.000 65.088 157.379 155.533 411 [5,] 159.000 192.000 324.000 251.000 926 > ### OR's respecto de la clase (1,1) ### > round( OR.11( predAU ), 4 ) [,1] [,2] [,3] [,4] [1,] 1 1.0000 1.0000 1.0000 [2,] 1 1.3309 1.7712 2.3573 [3,] 1 1.7712 3.1372 5.5567 [4,] 1 2.3573 5.5567 13.0988 > > > > > > ### bajo m.AU: OR de subtablas 2*2 iguales a exp(dist*vcoef) ### ### con dist la "distancia" entre clases. (k-i)*(l-j) ### dist <- c( 1, 2, 3, 4, 6, 9 ) OR.dist <- exp( dist*vcoef ) OR.dist.inf <- exp( dist*v.ic.perfil[1] ) OR.dist.sup <- exp( dist*v.ic.perfil[2] ) > round( cbind( dist, OR.dist, OR.dist.inf, OR.dist.sup ), 4 ) dist OR.dist OR.dist.inf OR.dist.sup [1,] 1 1.3309 1.2602 1.4079 [2,] 2 1.7712 1.5882 1.9821 [3,] 3 2.3573 2.0015 2.7906 [4,] 4 3.1372 2.5224 3.9288 [5,] 6 5.5567 4.0061 7.7874 [6,] 9 13.0988 8.0184 21.7316 4 > ### Modelo QS de cuasi-simetría o Asociación Simétrica ### > sime <- v; sime[6] <- 7 > sime <- as.factor( sime ) > m.QS <- glm( y ~ ps + cn + sime, family=poisson ) > summary( m.QS ) Call: glm(formula = y ~ ps + cn + sime, family = poisson) Deviance Residuals: 1 2 0.000e+00 -4.654e-01 8 9 -4.736e-02 -1.910e-01 15 16 2.308e-01 1.429e-07 3 1.067e-01 10 6.016e-01 4 5.152e-01 11 9.424e-08 Coefficients: (3 not defined because of Estimate Std. Error z value (Intercept) 4.3944 0.1111 39.550 ps2 -2.0172 0.1875 -10.760 ps3 -0.8642 0.1458 -5.926 ps4 0.3874 0.1079 3.590 cn2 -0.7419 0.1558 -4.761 cn3 0.2813 0.1243 2.264 cn4 0.2744 0.1079 2.543 sime2 0.6229 0.1789 3.482 sime3 -0.5952 0.1562 -3.811 sime4 -1.1160 0.1350 -8.269 sime6 0.8298 0.2139 3.880 sime7 1.6227 0.3355 4.836 sime8 NA NA NA sime9 0.4925 0.2140 2.301 sime12 NA NA NA sime16 NA NA NA Null deviance: 431.0781 Residual deviance: 2.5505 AIC: 119.23 on 15 on 3 5 8.463e-01 12 -4.391e-01 6 -3.650e-08 13 -5.007e-01 7 -6.655e-01 14 2.360e-02 singularities) Pr(>|z|) < 2e-16 *** < 2e-16 *** 3.10e-09 *** 0.000330 *** 1.92e-06 *** 0.023580 * 0.010985 * 0.000497 *** 0.000139 *** < 2e-16 *** 0.000104 *** 1.32e-06 *** NA 0.021365 * NA NA degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 4 El modelo de cuasi-simetría proporciona un buen ajuste global a la tabla observada y es fácilmente interpretable como modelo de asociación simétrica, pero ajusta peor que el modelo de asociación uniforme, si consideramos el equilibrio entre ajuste y complejidad dado por el AIC. > anova( m.QS, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL ps cn sime Df Deviance Resid. Df Resid. Dev 15 431.08 3 236.30 12 194.78 3 67.13 9 127.65 6 125.10 3 2.55 P(>|Chi|) 6.012e-51 1.759e-14 1.379e-24 5 > ### tabla de valores esperados estimados bajo m.QS > predQS <- matrix( m.QS$fitted.values, 4, 4, byrow=T ) > round( addmargins( predQS ), 4 ) [,1] [,2] [,3] [,4] [,5] [1,] 81.0000 71.9107 59.1776 34.9117 247 [2,] 20.0893 26.0000 32.7327 14.1780 93 [3,] 18.8224 37.2673 74.0000 44.9103 175 [4,] 39.0883 56.8220 158.0897 157.0000 411 [5,] 159.0000 192.0000 324.0000 251.0000 926 > ### bajo m.QS las OR de subtablas 2*2 de clases simétricas son iguales > predQS[1,2]*predQS[4,3]/(predQS[4,2]*predQS[1,3]) [1] 3.380825 > predQS[2,1]*predQS[3,4]/(predQS[2,4]*predQS[3,1]) [1] 3.380825 > ### las variables dummy sime8, sime12 y sime16 son superfluas > model.matrix(m.QS) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 (Intercept) ps2 ps3 ps4 cn2 cn3 cn4 sime2 sime3 sime4 sime6 sime7 sime8 sime9 sime12 sime16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 attr(,"assign") [1] 0 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 attr(,"contrasts") attr(,"contrasts")$ps [1] "contr.treatment" attr(,"contrasts")$cn [1] "contr.treatment" attr(,"contrasts")$sime [1] "contr.treatment" > > > > explica <- model.matrix(m.QS)[,c(1:12, 14)] ee <- explica[,8:13] s1 <- ee[,1]; s2 <- ee[,2]; s3 <- ee[,3]; s4 <- ee[,4]; s5 <- ee[,5]; s6 <- ee[,6] > m.QS2 <- glm( y ~ ps + cn + s1+s2+s3+s4+s5+s6, family=poisson ) > summary( m.QS2 ) Call: glm(formula = y ~ ps + cn + s1 + s2 + s3 + s4 + s5 + s6, family = poisson) Deviance Residuals: 1 2 0.000e+00 -4.654e-01 8 9 3 1.067e-01 10 4 5.152e-01 11 5 8.463e-01 12 6 -3.650e-08 13 7 -6.655e-01 14 6 -4.736e-02 15 2.308e-01 -1.910e-01 16 1.429e-07 6.016e-01 9.424e-08 -4.391e-01 -5.007e-01 2.360e-02 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 4.3944 0.1111 39.550 < 2e-16 *** ps2 -2.0172 0.1875 -10.760 < 2e-16 *** ps3 -0.8642 0.1458 -5.926 3.10e-09 *** ps4 0.3874 0.1079 3.590 0.000330 *** cn2 -0.7419 0.1558 -4.761 1.92e-06 *** cn3 0.2813 0.1243 2.264 0.023580 * cn4 0.2744 0.1079 2.543 0.010985 * s1 0.6229 0.1789 3.482 0.000497 *** s2 -0.5952 0.1562 -3.811 0.000139 *** s3 -1.1160 0.1350 -8.269 < 2e-16 *** s4 0.8298 0.2139 3.880 0.000104 *** s5 1.6227 0.3355 4.836 1.32e-06 *** s6 0.4925 0.2140 2.301 0.021365 * Null deviance: 431.0781 Residual deviance: 2.5505 AIC: 119.23 on 15 on 3 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 4 > anova( m.QS2, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL ps cn s1 s2 s3 s4 s5 s6 Df Deviance Resid. Df Resid. Dev 15 431.08 3 236.30 12 194.78 3 67.13 9 127.65 1 13.34 8 114.31 1 17.10 7 97.21 1 67.48 6 29.74 1 1.32 5 28.41 1 20.53 4 7.88 1 5.33 3 2.55 P(>|Chi|) 6.012e-51 1.759e-14 2.598e-04 3.544e-05 2.133e-16 0.25 5.874e-06 0.02 > ### Modelo m.SI de simetría > sime <- v; sime[6] <- 7 > sime <- as.factor( sime ) > m.SI <- glm( y ~ sime, family=poisson ) > summary( m.SI ) Null deviance: 431.08 Residual deviance: 150.27 AIC: 260.95 on 15 on 6 degrees of freedom degrees of freedom El modelo de simetría proporciona muy mal ajuste. 7 Aplicación de SAS options pagesize=500; data A; input P C fobs @@; AU = P*C; * para el modelo de Asociacion Uniforme; cards; 1 1 81 1 2 68 1 3 60 1 4 38 2 1 24 2 2 26 2 3 29 2 4 14 3 1 18 3 2 41 3 3 74 3 4 42 4 1 36 4 2 57 4 3 161 4 4 157 ; proc freq; weight fobs; table P*C / chisq; title Tabla: Prematrimoniales y Control de natalidad; run; * modelo log-lineal de Asociacion Uniforme; proc genmod data=A; class P C; model fobs = P C AU / dist=poisson link=log covb xvars; output out=sal_AU predicted=frec_AU xbeta=xbeta stdxbeta=stdxbeta resdev=resdev l=inf u=sup; title Modelo log-lineal de Asociacion Uniforme; run; proc print data=sal_AU; var P C AU fobs frec_AU xbeta inf sup; run; * Tabla de valores observados; proc freq data = sal_AU; weight fobs; table P*C / nopercent norow nocol; title Tabla de valores Observados; run; * Tabla de valores esperados bajo Asociacion Uniforme; proc freq data=sal_AU; weight frec_AU; table P*C / nopercent norow nocol; title Tabla de valores esperados bajo Asociacion Uniforme; run; 8