[R-es] Simulación de modelo logit con interacción
Olivier Nuñez
onunez en unex.es
Jue Ene 22 18:33:11 CET 2015
Bueno, se parece a un problema de separación.
> dat <- data.frame(x1 = rep(c(0,1,1,0), each = n),
+ x2= rep(c(0,1), times = n))
>
> odds <- exp( -1 - 4 * dat$x1 + 2*dat$x2 - 1 * dat$x1 * dat$x2 )
>
> pr <- odds/(1+odds)
> dat$y <- rbinom(n,1,pr)
> table(dat)
, , y = 0
x2
x1 0 1
0 730 278
1 730 278
, , y = 1
x2
x1 0 1
0 270 722
1 270 722
En otras palabras, conociendo "y" y "x2" es "muy difícil" averiguar si "x1" tomo el valor 0 o 1.
Por lo tanto, resulta difícil evaluar tanto el efecto principal de esta ultima variable como su interacción con x1.
Te aconsejo optar por un diseño más adecuado y utilizar un regresión logística penalizada (ejemplo: función bayesglm del paquete arm).
Un saludo. Olivier
----- Mensaje original -----
De: "Carlos J. Gil Bellosta" <cgb en datanalytics.com>
Para: "Emilio Torres Manzanera" <torres en uniovi.es>
CC: "r-help-es" <r-help-es en r-project.org>
Enviados: Jueves, 22 de Enero 2015 13:46:44
Asunto: Re: [R-es] Simulación de modelo logit con interacción
Hola, ¿qué tal?
Compara los dos gráficos siguientes:
set.seed(1234)
n <- 100000
logisticsimulation <- function(n){
dat <- data.frame(x1 = rep(c(0,1), each = n),
x2 = rep(c(0,1), times = n))
odds <- exp(-1 - 4 * dat$x1 + 2*dat$x2 - 1 * dat$x1 * dat$x2 )
dat$x1 <- factor(dat$x1)
dat$x2 <- factor(dat$x2)
pr <- odds/(1+odds)
res <- replicate(100, {
dat$y <- rbinom(n,1,pr)
coef(glm(y ~ x1*x2, data = dat, family = binomial()))
})
t(res)
}
res <- logisticsimulation(100)
apply(res,2,median)
res <- as.data.frame(res)
plot(res)
logisticsimulation <- function(n){
dat <- data.frame(x1 = rep(c(0,1), each = n),
x2 = rep(c(0,1), times = n))
odds <- exp(-1 - 4 * dat$x1 + 7*dat$x2 - 1 * dat$x1 * dat$x2 )
dat$x1 <- factor(dat$x1)
dat$x2 <- factor(dat$x2)
pr <- odds/(1+odds)
res <- replicate(100, {
dat$y <- rbinom(n,1,pr)
coef(glm(y ~ x1*x2, data = dat, family = binomial()))
})
t(res)
}
res <- logisticsimulation(100)
apply(res,2,median)
res <- as.data.frame(res)
plot(res)
El primero es tu caso. El segundo, uno menos extremo. Verás que tienes
problemas de estabilidad en el coeficiente de x2 porque el coeficiente
es demasiado grande. Tal vez necesites un n mayor para estimar tus
coeficientes bien si tienen ese rango. Un x2 distinto de cero es toda
una rareza.
Salud,
Carlos J. Gil Bellosta
http://www.datanalytics.com
El día 22 de enero de 2015, 12:28, Emilio Torres Manzanera
<torres en uniovi.es> escribió:
> Hola,
> Deseo simular un modelo logit con interacción, estimar sus coeficientes y comprobar si son o no parecidos al modelo teórico. Con este ejemplo obtengo que los coeficientes estimados no se asemejan mucho a los originales. ¿Se le ocurre a alguien cuál es el motivo de esta discrepancia? ¿y cómo solucionarlo?
> Muchas gracias
> Emilio
>
> logisticsimulation <- function(n){
> dat <- data.frame(x1=sample(0:1, n,replace=TRUE),
> x2=sample(0:1, n,replace=TRUE))
> odds <- exp(-1 - 4 * dat$x1 + 7*dat$x2 - 1 *dat$x1* dat$x2 )
> pr <- odds/(1+odds)
> res <- replicate(100, {
> dat$y <- rbinom(n,1,pr)
> coef(glm(y ~ x1*x2, data = dat, family = binomial()))
> })
> t(res)
> }
>
> res <- logisticsimulation(100)
> apply(res,2,median)
> ## (Intercept) x1 x2 x1:x2
> ## -1.0986123 -18.4674562 20.4823593 -0.0512933
>
> Deberían salir -1, -4, 7, 1
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
_______________________________________________
R-help-es mailing list
R-help-es en r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es
Más información sobre la lista de distribución R-help-es