Simulación de Intervalos de Confianza A continuación aparecen tres scripts que permiten simular diferentes situaciones: en breve: • Caso A: variable con distribución normal • Caso B: variable con distribución no normal • Caso C: uso incorrecto de la distribución del estadístico (normal, en vez de t de Student) Con el caso A se puede apreciar que la proporción de IC que contienen la media coincide con el valor de la confianza utilizada (95%). Los IC que fallan se colorean de rojo. En el caso B, cuando la distribución de origen no es normal (se usa una exponencial), y el tamaño de muestra es pequeño, entonces la proporción de IC que contienen la media es menor que la confianza empleada. El caso C sirve para expresar la procedencia de la distribución t de Student, por usar la estimación de σ en vez del valor real. Si se hace incorrectamente, y se le supone al estadístico x−µ s n una distribución N(0,1), entonces los IC correspondientes no contienen la media en la proporción correcta. En la actividad propuesta se debe repetir la simulación (50 muestras cada vez) lo suficiente como para que el efecto sea evidente. Por ejemplo, si se repite 10 veces, hay que anotar y sumar cuántos IC han fallado en cada vez. Así, para el caso A se esperan unos 25, pero para el B o el C han de ser más, en función del tamaño de muestra (la variable n). Optativamente, puede cambiarse el tamaño n y ver qué ocurre (en el caso B se representa también la auténtica distribución de la media muestral, que no es Normal, pero que para n grandes será parecida). También puede cambiarse fácilmente el código para obtener IC al 90%, o a cualquier otro nivel. Intervalos de confianza para la media de la variable 0.00 0.04 0.08 0.12 CASO A: la variable sigue una distribución normal 150 160 170 mu=170 sig=10 n = 9 sig2 = sig/sqrt(n) M=50 sam = array(rnorm(M*n, mu, sig), dim=c(M,n)) meds = apply(sam, 1, mean) std = apply(sam, 1, sd) icL = meds - qt(0.975, n-1)*std/sqrt(n) icR = meds + qt(0.975, n-1)*std/sqrt(n) ok = ifelse(icL<mu & icR>mu, "black", "red") x = seq(mu-2*sig, mu+2*sig, len=61) x2 = seq(mu-3*sig2, mu+3*sig2, len=61) y = dnorm(x, mu, sig) y2 = dnorm(x2, mu, sig2) top = dnorm(mu, mu, sig2) opar=par() par(mfrow=c(2,1), mar=c(2,2,1,0.5)) plot(x, y, t="l", ylim=c(0, top)) lines(x2, y2, col="blue") rug(meds) plot(range(x), c(1, M), t="n", axes=F, ylab="",xlab="") abline(v=mu, col="green2", lty=2) segments(icL, 1:M, icR, 1:M, col=ok) par(opar) 180 190 0.00 0.04 0.08 CASO B: la variable no sigue una distribución normal 0 5 10 15 20 25 # Es la distribución exacta de la media_exp = function(x, n, t) { n*dgamma(x*n, shape=n, rate=t) # media de n exponenciales } mu=10 rate = 1/mu sig = 1/rate n = 6 sig2 = sig/sqrt(n) M=50 sam = array(rexp(M*n, rate), dim=c(M,n)) meds = apply(sam, 1, mean) std = apply(sam, 1, sd) icL = meds - qt(0.975, n-1)*std/sqrt(n) icR = meds + qt(0.975, n-1)*std/sqrt(n) ok = ifelse(icL<mu & icR>mu, "black", "red") x = seq(0, qexp(0.95,rate), len=61) x2 = seq(mu-3*sig2, mu+3*sig2, len=61) y = dexp(x, rate) y2 = dnorm(x2, mu, sig2) # aproximación normal y3 = media_exp(x2, n, rate) # exacta top = max(y3) opar=par() par(mfrow=c(2,1), mar=c(2,2,1,0.5)) plot(x, y, t="l", ylim=c(0, top)) lines(x2, y2, col="blue") lines(x2, y3, col="violet") rug(meds) plot(range(x), c(1, M), t="n", axes=F, ylab="",xlab="") abline(v=mu, col="green2", lty=2) segments(icL, 1:M, icR, 1:M, col=ok) par(opar) 30 CASO C: la variable sigue una distribución normal, pero la muestra es pequeña y no se usa la t de Student sino la Normal. alfa = 0.05 # para hacer IC(95%) mu=50 sig=10 n = 5 sig2 = sig/sqrt(n) M=50 sam = array(rnorm(M*n, mu, sig), dim=c(M,n)) meds = apply(sam, 1, mean) std = apply(sam, 1, sd) icL = meds - qnorm(1-alfa/2)*std/sqrt(n) # qnorm en vez de qt es incorrecto icR = meds + qnorm(1-alfa/2)*std/sqrt(n) # idem: IC demasiado estrecho. ok = ifelse(icL<mu & icR>mu, "black", "red") fail=length(ok[ok=="red"]) msg=paste(fail,"CI failed to catch the mean.") x = seq(mu-2*sig, mu+2*sig, len=61) x2 = seq(mu-3*sig2, mu+3*sig2, len=61) y = dnorm(x, mu, sig) y2 = dnorm(x2, mu, sig2) top = dnorm(mu, mu, sig2) opar=par() par(mfrow=c(2,1), mar=c(2,2,1,0.5)) plot(x, y, t="l", ylim=c(0, top), main=msg) lines(x2, y2, col="blue") rug(meds) plot(range(x), c(1, M), t="n", axes=F, ylab="",xlab="") abline(v=mu, col="green2", lty=2) segments(icL, 1:M, icR, 1:M, col=ok) par(opar) 0.10 0.08 0.06 Fail/M 0.12 0.14 0.16 El número de IC que no encierran la media es más alto de lo usual. Con alfa = 0.05, debería haber un promedio de 2.5 intervalos. Si se repite varias veces la ejecución (al menos 10) y se acumulan los fallos, debería apreciarse el desvío, y cómo se amortigua a medida que la muestra crece. Sugerencia: probar con n=3, 5, 7, 9, 11. 5 10 15 20 N 25 30