Preferencia por un nuevo Detergente: Para un estudio de mercado sobre las preferencias entre un nuevo detergente Xx y uno standard Mm se consideró una muestra de 1008 consumidores, a los que se preguntó sobre su preferencia, si habían usado previamente Mm, sobre la dureza del agua utilizada y la temperatura de lavado habitual. Los resultados se recogen en la siguiente tabla: Agua suave media Temper prefiere MoX Xx Mm Xx Mm usuario Previo alta baja nousuario Previo alta baja 19 29 57 49 29 27 63 53 23 47 47 55 33 23 66 50 Xx 24 37 42 68 Mm 43 52 30 42 Analiza la tabla de contingencia ajustando un modelo log-lineal que explique la relación entre las distintas variables. Ajusta un modelo que explique la preferencia por una u otra marca. dura > y <- c(19, 57, 29, 63, 29, 49, 27, 53, 23, 47, 33, 66, 47, 55, 23, 50, + 24, 37, 42, 68, 43, 52, 30, 42) > ly <- length( y ) > > > > T P M A <<<<- gl(2, 1, ly, labels = c("alta", "baja") ) ### Temperatura lavado gl(2, 2*1, ly, labels=c("si", "no") ) ### usuario Previo gl( 2, 2*2*1, ly, labels = c("X", "M") ) ### Marca preferida gl( 3, 2*2*2*1, ly, labels=c("suave", "media", "dura") ) ### Agua lavado > data.frame( T, P, M, A, y ) T P M A y 1 alta si X suave 19 2 baja si X suave 57 3 alta no X suave 29 4 baja no X suave 63 5 alta si M suave 29 6 baja si M suave 49 7 alta no M suave 27 8 baja no M suave 53 9 alta si X media 23 10 baja si X media 47 11 alta no X media 33 12 baja no X media 66 13 alta si M media 47 14 baja si M media 55 15 alta no M media 23 16 baja no M media 50 17 alta si X dura 24 18 baja si X dura 37 19 alta no X dura 42 20 baja no X dura 68 21 alta si M dura 43 22 baja si M dura 52 23 alta no M dura 30 24 baja no M dura 42 > tTPMA <- xtabs( y ~ T + P + M + A ) 1 > ftable( tTPMA ) A suave media dura T P M alta si X 19 23 24 M 29 47 43 no X 29 33 42 M 27 23 30 baja si X 57 47 37 M 49 55 52 no X 63 66 68 M 53 50 42 Ajuste de modelos log-lineales de orden completo: > ################################## > ### modelo completo de orden 1 ### > m1 <- glm( y ~ A + M + P + T, family=poisson ) > > > > > devres <- deviance( m1 ); aic <- AIC( m1 ) gdl <- m1$df.residual dev.gdl <- devres/gdl pval.dev <- 1-pchisq( devres, gdl ) cbind( aic, devres, gdl, dev.gdl, pval.dev ) aic devres gdl dev.gdl pval.dev [1,] 187.3437 42.92866 18 2.384925 0.0008190181 > anova( m1, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL A M P T Df Deviance Resid. Df Resid. Dev P(>|Chi|) 23 118.627 2 0.501 21 118.125 0.778 1 0.063 20 118.062 0.801 1 1.921 19 116.141 0.166 1 73.212 18 42.929 1.164e-17 > drop1( m1, test="Chisq" ) Single term deletions Model: y ~ A + M + P + T Df Deviance AIC LRT Pr(Chi) <none> 42.929 187.344 A 2 43.430 183.845 0.501 0.7782 M 1 42.992 185.407 0.063 0.8011 P 1 44.850 187.265 1.921 0.1657 T 1 116.141 258.556 73.212 <2e-16 *** --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 2 > ################################## > ### modelo completo de orden 2 ### > m2 <- glm( y~A+M+P+T+A*M+A*P+A*T+M*P+M*T+P*T, family=poisson ) > > > > > devres <- deviance( m2 ); aic <- AIC( m2 ) gdl <- m2$df.residual dev.gdl <- devres/gdl pval.dev <- 1-pchisq( devres, gdl ) cbind( aic, devres, gdl, dev.gdl, pval.dev ) aic devres gdl dev.gdl pval.dev [1,] 172.2612 9.846211 9 1.094023 0.3630783 > anova( m2, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL A M P T A:M A:P A:T M:P M:T P:T Df Deviance Resid. Df Resid. Dev P(>|Chi|) 23 118.627 2 0.501 21 118.125 0.778 1 0.063 20 118.062 0.801 1 1.921 19 116.141 0.166 1 73.212 18 42.929 1.164e-17 2 0.395 16 42.533 0.821 2 1.075 14 41.458 0.584 2 6.099 12 35.359 0.047 1 20.463 11 14.896 6.079e-06 1 4.310 10 10.586 0.038 1 0.740 9 9.846 0.390 > drop1( m2, test="Chisq" ) Single term deletions Model: y ~ A + M + P + T + A * M + A * P + A * T + M * P + M * T + P * T Df Deviance AIC LRT Pr(Chi) <none> 9.846 172.261 A:M 2 10.062 168.477 0.216 0.89778 A:P 2 10.851 169.266 1.005 0.60502 A:T 2 15.942 174.357 6.096 0.04747 * M:P 1 29.738 190.153 19.892 8.194e-06 *** M:T 1 13.585 174.000 3.739 0.05316 . P:T 1 10.586 171.001 0.740 0.38974 --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 3 > ################################## > ### modelo completo de orden 3 ### > + > > > > > m3 <- glm( y~A+M+P+T+A*M+A*P+A*T+M*P+M*T+P*T+ A*M*P+A*M*T+A*P*T+M*P*T, family=poisson ) devres <- deviance( m3 ); aic <- AIC( m3 ) gdl <- m3$df.residual dev.gdl <- devres/gdl pval.dev <- 1-pchisq( devres, gdl ) cbind( aic, devres, gdl, dev.gdl, pval.dev ) aic devres gdl dev.gdl pval.dev [1,] 177.1523 0.7373169 2 0.3686585 0.6916616 > anova( m3, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL A M P T A:M A:P A:T M:P M:T P:T A:M:P A:M:T A:P:T M:P:T Df Deviance Resid. Df Resid. Dev P(>|Chi|) 23 118.627 2 0.501 21 118.125 0.778 1 0.063 20 118.062 0.801 1 1.921 19 116.141 0.166 1 73.212 18 42.929 1.164e-17 2 0.395 16 42.533 0.821 2 1.075 14 41.458 0.584 2 6.099 12 35.359 0.047 1 20.463 11 14.896 6.079e-06 1 4.310 10 10.586 0.038 1 0.740 9 9.846 0.390 2 5.328 7 4.518 0.070 2 0.161 5 4.357 0.923 2 1.398 3 2.959 0.497 1 2.222 2 0.737 0.136 > drop1( m3, test="Chisq" ) Single term deletions Model: y ~ A + M + P + T + A * M + A * P + A * T + M * P + M * T + P * T + A * M * P + A * M * T + A * P * T + M * P * T Df Deviance AIC LRT Pr(Chi) <none> 0.737 177.152 A:M:P 2 5.309 177.724 4.571 0.1017 A:M:T 2 0.899 173.314 0.162 0.9223 A:P:T 2 2.115 174.530 1.377 0.5022 M:P:T 1 2.959 177.374 2.222 0.1361 4 > anova( m1, m2, m3, test="Chisq" ) Analysis of Deviance Table Model 1: y ~ A + M + P + T Model 2: y ~ A + M + P + T + A * M + A * P + A * T + M * P + M * T + P * T Model 3: y ~ A + M + P + T + A * M + A * P + A * T + M * P + M * T + P * T + A * M * P + A * M * T + A * P * T + M * P * T Resid. Df Resid. Dev Df Deviance P(>|Chi|) 1 18 42.929 2 9 9.846 9 33.082 0.0001292 3 2 0.737 7 9.109 0.245 El modelo completo de orden 1, m1, no ajusta bien las frecuencias observadas (se rechaza la no asociación entre los cuatro factores). El modelo completo de orden 2 proporciona un buen ajuste. Del análisis del modelo m3 se deduce que no parece necesario incluir ningún efecto de orden 3. A la vista de los resultados del análisis secuencial de la deviance (anova) y de los tests de eliminación de efectos (drop1) en el ajuste del modelo completo de orden 2, m2, se puede decir que los efectos AM, AP y PT no son significativos. Un modelo adecuado es el modelo log-lineal jerárquico (MP, MT, AT). > ############################################ > ### efectos seleccionados del ajuste de los modelos de orden completo > m.MP.MT.AT <- glm( y~A+M+P+T+ M*P + M*T + A*T, family=poisson ) > > > > > devres <- deviance( m.MP.MT.AT ); aic <- AIC( m.MP.MT.AT ) gdl <- m.MP.MT.AT$df.residual dev.gdl <- devres/gdl pval.dev <- 1-pchisq( devres, gdl ) cbind( aic, devres, gdl, dev.gdl, pval.dev ) aic devres gdl dev.gdl pval.dev [1,] 164.3015 11.88649 14 0.8490348 0.6154184 El modelo (MP, MT, AT) proporciona muy buen ajuste. > anova( m.MP.MT.AT, test="Chisq" ) Analysis of Deviance Table Model: poisson, link: log Response: y Terms added sequentially (first to last) NULL A M P T M:P M:T A:T Df Deviance Resid. Df Resid. Dev P(>|Chi|) 23 118.627 2 0.501 21 118.125 0.778 1 0.063 20 118.062 0.801 1 1.921 19 116.141 0.166 1 73.212 18 42.929 1.164e-17 1 20.581 17 22.347 5.715e-06 1 4.362 16 17.986 0.037 2 6.099 14 11.886 0.047 La sucesiva adición de efectos, MP, MT y AT produce una mejora (reducción de la deviance) significativa en el ajuste del modelo. 5 > drop1( m.MP.MT.AT, test="Chisq" ) Single term deletions Model: y ~ A + M + P + T + M * P + M * T + A * T Df Deviance AIC LRT Pr(Chi) <none> 11.886 164.302 M:P 1 32.468 182.883 20.581 5.715e-06 *** M:T 1 16.248 166.663 4.362 0.03676 * A:T 2 17.986 166.401 6.099 0.04738 * --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 No es posible la eliminación de ninguno de los efectos de orden 2 del modelo ajustado, (MP, MT, AT), sin que se produzca una pérdida significativa en el ajuste. No obstante podríamos pensar que un modelo más sencillo, por ejemplo (A, T, MP), podría dar un ajuste razonable. Veamos: > > > > > > > ############################################ m.MP <- glm( y~A+M+P+T+ M*P, family=poisson ) devres <- deviance( m.MP ); aic <- AIC( m.MP ) gdl <- m.MP$df.residual dev.gdl <- devres/gdl pval.dev <- 1-pchisq( devres, gdl ) cbind( aic, devres, gdl, dev.gdl, pval.dev ) aic devres gdl dev.gdl pval.dev [1,] 168.7622 22.34719 17 1.314541 0.1717329 Podemos observar que este modelo, (A, T, MP), proporciona un buen ajuste (basta ver su deviance residual), pero si lo comparamos con el modelo anterior, (MP, MT, AT), la menor complejidad de (A, T, MP) no compensa la pérdida en el ajuste (observar el mayor valor del AIC del modelo (A, T, MP). Dado que ambos modelos están anidados podemos mediante anova realizar un test condicional para valorar la pérdida en el ajuste: > anova( m.MP, m.MP.MT.AT, test="Chisq" ) Analysis of Deviance Table Model 1: Model 2: Resid. 1 2 y ~ A + M + P + T + M * P y ~ A + M + P + T + M * P + M * T + A * T Df Resid. Dev Df Deviance P(>|Chi|) 17 22.347 14 11.886 3 10.461 0.015 La mejora en el ajuste del modelo (MP, MT, AT) respecto del (A, T, MP) es significativa. Por consiguiente podemos adoptar como mejor modelo log-lineal: (MP, MT, AT). P es no está asociada con A y es condicionalmente independiente de T, dado M. M es condicionalmente independiente de A, dado T, pero está fuertemente asociada con P y con T. > #################################################################### > ### Variable respuesta binaria: Marca preferida: X(la nueva) o M ### > ### arreglo de los datos: yX=prefieren X; yM=prefieren M; > yX <- y[M=="X"]; yM <- y[M=="M"]; total <- yX + yM; > AA <- A[M=="X"]; PP <- P[M=="X"]; TT <- T[M=="X"]; > p.X.obs <- yX/total ### proporción observada de respuesta X > respuesta <- cbind( yX, yM ) ### para ajuste de logístico en glm 6 > ### m.M: modelo logístico con efectos principales Agua, uso Previo y Temper > m.M <- glm( respuesta ~ AA + PP + TT, family=binomial ) > summary( m.M ) Call: glm(formula = respuesta ~ AA + PP + TT, family = binomial) Deviance Residuals: Min 1Q Median -1.2785 -0.6382 -0.1765 3Q 0.5601 Max 1.5738 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -0.41143 0.15812 -2.602 0.00927 ** AAmedia -0.07063 0.15664 -0.451 0.65207 AAdura -0.02111 0.15763 -0.134 0.89346 PPno 0.56702 0.12775 4.439 9.05e-06 *** TTbaja 0.25665 0.13286 1.932 0.05340 . --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 32.826 Residual deviance: 8.228 AIC: 75.926 on 11 on 7 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 3 > anova( m.M, test="Chisq" ) Analysis of Deviance Table Model: binomial, link: logit Response: respuesta Terms added sequentially (first to last) NULL AA PP TT Df Deviance Resid. Df Resid. Dev P(>|Chi|) 11 32.826 2 0.395 9 32.430 0.821 1 20.463 8 11.967 6.079e-06 1 3.739 7 8.228 0.053 > drop1( m.M, test="Chisq" ) Single term deletions Model: respuesta ~ AA + PP + TT Df Deviance AIC LRT Pr(Chi) <none> 8.228 75.926 AA 2 8.444 72.142 0.216 0.89763 PP 1 28.120 93.818 19.892 8.192e-06 *** TT 1 11.967 77.665 3.739 0.05315 . --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Aunque el ajuste de este modelo logit , m.M, de efectos principales es bueno (ver deviance residual), el modelo que excluye el efecto A es mejor, aún dando un peor ajuste. No obstante el efecto de A podría ser significativo en un modelo con interacciones. 7 > p.X.pred <- round( m.M$fitted.values, 4 ) > data.frame( AA, PP, TT, total, yM, yX, p.X.obs, p.X.pred ) 1 2 3 4 5 6 7 8 9 10 11 12 AA suave suave suave suave media media media media dura dura dura dura PP si si no no si si no no si si no no TT total yM yX p.X.obs p.X.pred alta 48 29 19 0.3958333 0.3986 baja 106 49 57 0.5377358 0.4614 alta 56 27 29 0.5178571 0.5388 baja 116 53 63 0.5431034 0.6016 alta 70 47 23 0.3285714 0.3818 baja 102 55 47 0.4607843 0.4439 alta 56 23 33 0.5892857 0.5212 baja 116 50 66 0.5689655 0.5846 alta 67 43 24 0.3582090 0.3935 baja 89 52 37 0.4157303 0.4561 alta 72 30 42 0.5833333 0.5336 baja 110 42 68 0.6181818 0.5966 > ##################################################################### > ### modelo log-lineal equivalente al logít de efectos principales ### > mequiva <- glm( y~A+M+P+T+M*A+M*P+M*T+A*P*T, family=poisson ) > summary( mequiva ) Call: glm(formula = y ~ A + M + P + T + M * A + M * P + M * T + A * P * T, family = poisson) Deviance Residuals: Min 1Q -1.098061 -0.494204 Median -0.002817 3Q 0.403393 Max 1.127415 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 2.95133 0.17285 17.075 < 2e-16 *** Amedia 0.33422 0.21031 1.589 0.11201 Adura 0.32074 0.21170 1.515 0.12975 MM 0.41143 0.15812 2.602 0.00927 ** Pno 0.45565 0.20912 2.179 0.02934 * Tbaja 0.93858 0.19050 4.927 8.35e-07 *** Amedia:MM 0.07063 0.15664 0.451 0.65207 Adura:MM 0.02111 0.15763 0.134 0.89346 MM:Pno -0.56702 0.12775 -4.439 9.05e-06 *** MM:Tbaja -0.25665 0.13286 -1.932 0.05340 . Amedia:Pno -0.36741 0.26705 -1.376 0.16888 Adura:Pno -0.07922 0.26076 -0.304 0.76128 Amedia:Tbaja -0.41135 0.23336 -1.763 0.07795 . Adura:Tbaja -0.50697 0.23775 -2.132 0.03298 * Pno:Tbaja -0.10009 0.23906 -0.419 0.67545 Amedia:Pno:Tbaja 0.41580 0.32759 1.269 0.20434 Adura:Pno:Tbaja 0.20387 0.32540 0.627 0.53097 --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for poisson family taken to be 1) Null deviance: 118.627 Residual deviance: 8.228 AIC: 174.64 on 23 on 7 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 4 8 > ### Comprobación: > pred.eq <- exp( predict( mequiva ) ) > p.X.eq <- round( pred.eq[M=="X"]/total, 4 ) > ################################################################### > ### La función predict calcula los predictores lineales y su se ### > ### Cálculo de IC's para la probabilidad de respuesta X, bajo m.M > fexpit <- function(x) { exp(x)/(1+exp(x)) } > plin <- predict( m.M, se.fit=TRUE ) > p.X.plin <- round( fexpit( plin$fit ), 4 ) > > > > > > se.plin <- plin$se.fit alfa <- 0.05; confianza <- 1-alfa; ic.plin.inf <- plin$fit-qnorm(1-alfa/2)*se.plin ic.plin.sup <- plin$fit+qnorm(1-alfa/2)*se.plin ic.p.X.inf <- round( fexpit( ic.plin.inf ), 4) ic.p.X.sup <- round( fexpit( ic.plin.sup ), 4) > data.frame( ic.p.X.sup) AA 1 suave 2 suave 3 suave 4 suave 5 media 6 media 7 media 8 media 9 dura 10 dura 11 dura 12 dura AA, PP, TT, total, yM, yX, p.X.obs, p.X.pred, ic.p.X.inf, PP si si no no si si no no si si no no TT total yM yX p.X.obs p.X.pred ic.p.X.inf ic.p.X.sup alta 48 29 19 0.3958333 0.3986 0.3271 0.4746 baja 106 49 57 0.5377358 0.4614 0.3954 0.5287 alta 56 27 29 0.5178571 0.5388 0.4621 0.6138 baja 116 53 63 0.5431034 0.6016 0.5373 0.6626 alta 70 47 23 0.3285714 0.3818 0.3145 0.4539 baja 102 55 47 0.4607843 0.4439 0.3794 0.5103 alta 56 23 33 0.5892857 0.5212 0.4466 0.5949 baja 116 50 66 0.5689655 0.5846 0.5193 0.6470 alta 67 43 24 0.3582090 0.3935 0.3256 0.4659 baja 89 52 37 0.4157303 0.4561 0.3887 0.5253 alta 72 30 42 0.5833333 0.5336 0.4612 0.6046 baja 110 42 68 0.6181818 0.5966 0.5312 0.6587 9 Modelo logit con interacción AP: > m.M.int <- glm( respuesta ~ AA + PP + TT + AA*PP, family=binomial ) > summary( m.M.int ) Call: glm(formula = respuesta ~ AA + PP + TT + AA * PP, family = binomial) Deviance Residuals: 1 2 -0.76685 0.51160 9 10 0.01582 -0.01335 3 0.37308 11 0.26016 4 -0.26057 12 -0.21502 5 -0.74884 6 0.59853 7 0.82871 8 -0.58125 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -0.1981 0.1858 -1.066 0.2865 AAmedia -0.3280 0.2244 -1.461 0.1439 AAdura -0.3891 0.2308 -1.686 0.0918 . PPno 0.1698 0.2225 0.763 0.4455 TTbaja 0.2497 0.1333 1.873 0.0611 . AAmedia:PPno 0.4934 0.3126 1.579 0.1144 AAdura:PPno 0.6918 0.3156 2.192 0.0284 * --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 32.8256 Residual deviance: 3.1148 AIC: 74.813 on 11 on 5 degrees of freedom degrees of freedom Number of Fisher Scoring iterations: 3 > anova( m.M.int, test="Chisq" ) Analysis of Deviance Table Model: binomial, link: logit Response: respuesta Terms added sequentially (first to last) NULL AA PP TT AA:PP Df Deviance Resid. Df Resid. Dev P(>|Chi|) 11 32.826 2 0.395 9 32.430 0.821 1 20.463 8 11.967 6.079e-06 1 3.739 7 8.228 0.053 2 5.113 5 3.115 0.078 > drop1( m.M.int, test="Chisq" ) Single term deletions Model: respuesta ~ AA + PP + TT + AA * PP Df Deviance AIC LRT Pr(Chi) <none> 3.115 74.813 TT 1 6.629 76.327 3.514 0.06085 . AA:PP 2 8.228 75.926 5.113 0.07757 . --Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 10 > p.X.int <- m.M.int$fitted.values ### prob de X bajo interacción AP > difpX <- p.X.pred - p.X.int > data.frame( AA, PP, TT, total, yM, yX, p.X.obs, p.X.pred, p.X.int, difpX ) 1 2 3 4 5 6 7 8 9 10 11 12 AA suave suave suave suave media media media media dura dura dura dura PP si si no no si si no no si si no no TT total yM yX p.X.obs p.X.pred p.X.int difpX alta 48 29 19 0.3958333 0.3986 0.4506474 -0.05204741 baja 106 49 57 0.5377358 0.4614 0.5129144 -0.05151438 alta 56 27 29 0.5178571 0.5388 0.4929312 0.04586879 baja 116 53 63 0.5431034 0.6016 0.5551367 0.04646334 alta 70 47 23 0.3285714 0.3818 0.3714449 0.01035512 baja 102 55 47 0.4607843 0.4439 0.4313614 0.01253864 alta 56 23 33 0.5892857 0.5212 0.5342423 -0.01304231 baja 116 50 66 0.5689655 0.5846 0.5955382 -0.01093820 alta 67 43 24 0.3582090 0.3935 0.3572824 0.03621762 baja 89 52 37 0.4157303 0.4561 0.4164279 0.03967213 alta 72 30 42 0.5833333 0.5336 0.5681687 -0.03456870 baja 110 42 68 0.6181818 0.5966 0.6281078 -0.03150776 Si bien la mejora del ajuste del modelo logit con interacción A*P, m.M.int, respecto del modelo de efectos principales, m.M, no es significativa (a nivel 0.05) sí es importante, y el AIC de m.M.int es el menor de los modelos logits ajustados. Así pues en la explicación de la respuesta, el efecto del factor A se manifiesta principalmente a través de su interacción con el factor P. ################################################# > ### plot de probabilidad de respuesta X bajo m.M ### > + + + + > > + > > + > + > > + > plot( 1:length(yX), p.X.obs, ylim=c(0,1), type="b", lty=3, xaxt="n",pch="", xlab="12 grupos en covariables (Agua, uso Previo, Temperatura)", ylab="probabilidad de preferir X", cex.main=0.9, main="Probabilidad de preferencia por la nueva marca de detergente X: modelo de efectos principales" ) axis( side=1, at=c(1:12), labels=c(1:12) ) text(c(2,6.5,10.5), c(0.15,0.15,0.15), c("Agua: suave", "media", "dura")) segments(c(1:12),ic.p.X.inf, c(1:12),ic.p.X.sup, lwd=2,col="green") points(c(1,3,5,7,9,11), p.X.pred[c(1,3,5,7,9,11)], pch=16, col="red", cex=1.5 ) points(c(2,4,6,8,10,12), p.X.pred[c(2,4,6,8,10,12)], pch=15, col="blue", cex=1.5 ) points( 1:length(yX), p.X.obs ) ### proporciones observadas text(c(1,2,5,6,9,10), -0.05+p.X.pred[c(1,2,5,6,9,10)], rep("usabaM",6), cex=0.8 ) points( 1:12, p.X.int, pch=2 ) ### prob de X bajo interacción AP > > > > > > > > > abline(v=c(4.5,8.5),lty=3) legend(1,1.05, legend="", col="blue", pch=15, cex=1.5, bty="n") text(3,0.99, "temperatura baja", cex=0.9 ) legend(1,1, legend="", col="red", pch=16, cex=1.5, bty="n") text(3,0.94, "temperatura alta", cex=0.9 ) legend(1,0.95, legend="", pch=1, cex=1.5, bty="n") text(3.4, 0.89, "proporción observada", cex=0.9 ) legend(1,0.9, legend="", pch=2, cex=1.5, bty="n") text(3.9, 0.84, "prob de X bajo interacción AP", cex=0.9 ) 11 1.0 Probabilidad de preferencia por la nueva marca de detergente X: modelo de efectos principales temperatura baja temperatura alta proporción observada 0.6 0.4 usabaM usabaM usabaM usabaM usabaM 0.2 usabaM Agua: suave media dura 0.0 probabilidad de preferir X 0.8 prob de X bajo interacción AP 1 2 3 4 5 6 7 8 9 10 11 12 12 grupos en covariables (Agua, uso Previo, Temperatura) 12 Ajuste de modelos con SAS options pagesize=500; data deterg; do A = 1 to 3; do M =1 to 2; * M=1 prefiere otra marca; * M=2 la marca de interes; do P =1 to 2; * P=1 usuario previo; do T = 1 to 2; input FREC @@; output; end; end; end; end; cards; 19 57 29 63 29 49 27 53 23 47 33 66 47 55 23 50 24 37 42 68 43 52 30 42 ; run; /* proc print data=deterg; var _ALL_; run; */ proc genmod data=deterg; class a m p t; model frec = a m p t / dist=poi link=log; title Modelo log-lineal de orden 1 completo; run; proc genmod data=deterg; class a m p t; model frec = a m p t a*m a*p a*t m*p m*t p*t/ dist=poi link=log type1 type3; title Modelo de orden 2 completo; run; proc genmod data=deterg; class a m p t; model frec = a m p t a*m a*p a*t m*p m*t p*t a*m*p a*m*t a*p*t m*p*t / dist=poi link=log type1 type3; title Modelo de orden 3 completo; * model frec = a | m | p | t @3/ dist=poi link=log type1 type3; * Identico modelo, pero el ajuste secuencial de type1 es diferente; run; * a partir de los resultados obtenidos en los modelos anteriores; * Tres modelos log-lineales ¿razonables?; proc genmod data = deterg; class a m p t; model frec = a m p t m*p m*t a*t/ dist=poi link=log type1 type3 predicted xvars; title Modelo (MP, MT, AT); run; *****************************************************************************; * Organizacion de los datos para ajustar un modelo logit usando FREC_M2/TOTAL; * OJO!!! cuidado con el uso de merge en data D. Hay que asegurarse del orden; * Comprobar siempre el resultado; data B; set deterg; frec_M1 = frec; if M = 2 then delete; run; data C; set deterg; frec_M2 = frec; if M = 1 then delete; run; data D; set C; merge B; drop M frec; TOTAL = frec_M1 + frec_M2; prob_M2 = frec_M2 / TOTAL; * prob_M2: probab. en el M. Saturado (frec. relativas); run; 13 proc print data =D; var _ALL_; title Frecuencias de M segun patron de covariables A P T; run; proc genmod data=D; class A P T; model FREC_M2 / TOTAL = A P T / dist = bin link = logit predicted xvars; title Modelo logit con todos los efectos principales; run; proc genmod data=deterg; class a m p t; model frec = a m p t m*p m*t m*a a*p*t/ dist=poi link=log; output out=salida pred=predichos; title Modelo log-lineal equivalente al logit con todos los efectos principales; run; * Una forma complicada de obtener los resultados del ajuste del modelo logit; * a traves del ajuste del modelo log-lineal equivalente anterior; data E; set salida; data F; set E; F_M1 = frec; Pred_M1 = predichos; if M = 2 then delete; run; data G; set E; F_M2 = frec; Pred_M2 = predichos; if M = 1 then delete; run; data H; set G; merge F; drop M frec; TOTAL = F_M1 + F_M2; FRel_M2 = F_M2 / TOTAL; * prob_M2 probabilidades en el Modelo Saturado; TotPred = Pred_M1 + Pred_M2; ppred_M2 = Pred_M2/TotPred; * ppred_M2 probabilidades predichas por el modelo; run; proc print data=H; var A P T F_M1 F_M2 TOTAL FRel_M2 Pred_M1 Pred_M2 TotPred ppred_M2; title Valores predichos por el log-lineal equivalente al logit; run; * ajuste con PROC LOGISTIC del modelo logit con todos los efectos principales; proc logistic data = H; class A P T / param = REF; model F_M2 / TOTAL = A P T / covb ; output out=sal pred=pr_pred lower=inf upper=sup xbeta=xbeta stdxbeta=stdxbeta; title Modelo logit con todos los efectos principales (PROC LOGISTIC); run; proc print data=sal; * observar que coinciden PPRED_M2 y PR_PRED; var A P T F_M1 F_M2 TOTAL FRel_M2 Pred_M1 Pred_M2 ppred_M2 pr_pred inf sup; title Probabilidades estimadas de M2 bajo modelo logistico de efectos principales; run; * Modelo logistico sin el efecto A; proc logistic data = H; class A P T / param = REF; model F_M2 / TOTAL = P T ; output out=sal_P_T pred=pr_pred_P_T lower=inf upper=sup xbeta=xbeta stdxbeta=stdxbeta; title Modelo logit con los efectos principales P T; run; proc print data=sal_P_T; var A P T F_M1 F_M2 TOTAL FRel_M2 pr_pred_P_T inf sup; title Probabilidades estimadas de M2 bajo modelo logistico con efectos P T; run; 14