box cox
TRANSCRIPT
Transformación de Potencia Box-Cox
Modelos EstadísticosDra. Graciela González Farías
José Ramón Domínguez Molina
14/marzo/2003
Omar Posada Villarreal
Transformación de potencia
Simple Se requiere que la distribución sea
– Suave– Continua– X>0
Transformación de potencia
=2, Y=X2
=1/2, Y=X1/2
Se busca que la variable transformada se parezca a una distribución normal
0ln
01
)(
X
XYXT
),(~ 2)( NXY
Ejemplo: X ~ Exp(1) Rango: [-2, 2] pasos de 0.5.
La mejor fue = 0.5
Exponencial( 1 ) QQPlot normalizado. Desv. Tipica = 1.16
Quantiles of Standard Normal
X
-2 -1 0 1 2
-20
24
6
Tran. Box-Cox con SD min. QQPlot norm.(lambda = 0.5 , Desv. Tip. = 0.988 )
Quantiles of Standard Normal
Y
-2 -1 0 1 2
-20
24
6
0 2 4 6
02
04
06
0
Exponencial( 1 ) Histograma
X
Lambda vs. Desv. Tipica.(lambda = 0.5 , Desv. Tip. = 0.988 )
Lambda
log
(SD
)
-2 -1 0 1 2
15
10
50
Ejemplo: X ~ Exp(3) Rango: [0, 10] pasos de 0.05.
La mejor fue = 3.05
Exponencial( 3 ) QQPlot normalizado. Desv. Tipica = 0.364
Quantiles of Standard Normal
X
-2 -1 0 1 2
0.0
0.5
1.0
1.5
Tran. Box-Cox con SD min. QQPlot norm.(lambda = 3.05 , Desv. Tip. = 0.221 )
Quantiles of Standard Normal
Y
-2 -1 0 1 2
0.0
0.5
1.0
1.5
0.0 0.5 1.0 1.5
01
02
03
04
0
Exponencial( 3 ) Histograma
X
Lambda vs. Desv. Tipica.(lambda = 3.05 , Desv. Tip. = 0.221 )
Lambda
log
(SD
)
0 2 4 6 8 10
0.3
0.5
0.7
1.0
Ejemplo: X ~ U(0.01, 1) Rango: [-10, 10] pasos de 0.5.
La mejor fue >= 10
Uniforme( 0.01 , 1 ) QQPlot normalizado. Desv. Tipica = 0.286
Quantiles of Standard Normal
X
-2 -1 0 1 2
0.0
0.2
0.4
0.6
0.8
1.0
Tran. Box-Cox con SD min. QQPlot norm.(lambda = 10 , Desv. Tip. = 0.0222 )
Quantiles of Standard Normal
Y
-2 -1 0 1 2
0.0
0.2
0.4
0.6
0.8
1.0
0.0 0.2 0.4 0.6 0.8 1.0
02
46
81
01
21
4
Uniforme( 0.01 , 1 ) Histograma
X
Lambda vs. Desv. Tipica.(lambda = 10 , Desv. Tip. = 0.0222 )
Lambda
log
(SD
)
-10 -5 0 5 10
10
^-2
10
^11
0^4
10
^71
0^1
0
Ejemplo: X ~ U(1, 5) Rango: [-10, 10] pasos de 1.
La mejor fue <= -10
Uniforme( 1 , 5 ) QQPlot normalizado. Desv. Tipica = 1.23
Quantiles of Standard Normal
X
-2 -1 0 1 2
01
23
45
Tran. Box-Cox con SD min. QQPlot norm.(lambda = -10 , Desv. Tip. = 0.00843 )
Quantiles of Standard Normal
Y
-2 -1 0 1 2
01
23
45
1 2 3 4 5
05
10
15
Uniforme( 1 , 5 ) Histograma
X
Lambda vs. Desv. Tipica.(lambda = -10 , Desv. Tip. = 0.00843 )
Lambda
log
(SD
)
-10 -5 0 5 10
10
^-2
10
^01
0^2
10
^4
Ejemplo: X ~ Beta(5, 2.5) Rango: [-10, 10] pasos de 1.
La mejor fue >= 10
Beta( 5 , 2.5 ) QQPlot normalizado. Desv. Tipica = 0.165
Quantiles of Standard Normal
X
-2 -1 0 1 2
0.0
0.2
0.4
0.6
0.8
1.0
Tran. Box-Cox con SD min. QQPlot norm.(lambda = 10 , Desv. Tip. = 0.0138 )
Quantiles of Standard Normal
Y
-2 -1 0 1 2
0.0
0.2
0.4
0.6
0.8
1.0
0.2 0.4 0.6 0.8 1.0
05
10
15
20
25
Beta( 5 , 2.5 ) Histograma
X
Lambda vs. Desv. Tipica.(lambda = 10 , Desv. Tip. = 0.0138 )
Lambda
log
(SD
)
-10 -5 0 5 10
10
^-2
10
^11
0^3
10
^51
0^7
Listado S-Plus (1) # Realiza una transformación que se ajuste a la normal # @param fX Datos # @param leftlambda Limite inferior para probar lambda # @param rightLambda Limite superior para probar lambda # @param eachLambda Intervalo entre marcas boxCox = function(fX, leftLambda, rightLambda, eachLambda) { cX = data.matrix(fX) dimX = dim(cX) n = dimX[1]
origSD = stdev(cX) #Equivale a cXLambda1 = (cX ^ 1) - 1 #origSD = stdev(cXLambda1)
# Checa que xi>0 for (i in 1:n) { if (cX[i] <= 0) { stop("Debe ser: x[i]>0") } } # Inicializar # Rango de lambdas a probar minLambda = rightLambda rLambda = seq(leftLambda, rightLambda, by=eachLambda) nLambda = length(rLambda) minSD = 1E100 rSD = vector(mode="numeric", length=nLambda) cY = vector(mode="numeric", length=n)
Listado S-Plus (2) # Para cada lambda for (j in 1:nLambda) { # Transformacion Box-Cox # print(paste("- i=", i , " j=", j)) if (rLambda[j] != 0) { cY = (cX ^ rLambda[j] - 1) / rLambda[j] } else { cY = log(cX) }
# Recuerda el vector con min stdev rSD[j] = stdev(cY) if (rSD[j] < minSD) { cMinY = cY minLambda = rLambda[j] minSD = rSD[j] } }
return (cX, origSD, rLambda, rSD, cMinY, minLambda, minSD) }
Listado S-Plus (3) plotBoxCox = function(sTitle, cX, origSD, rLambda, rSD, cMinY, minLambda, minSD) { print("Original") # En una pagina par(mfrow = c(2,2)) options(digits=3)
# Conserva la mayor escala de los datos orig y tran en el eje Y minY = min(cX, cMinY) maxY = max(cX, cMinY)
# Grafica qqplot normalizado de los datos originales # Muestra la varianza actual. sTitle2 = paste(sTitle, "\nQQPlot normalizado. Desv. Tipica = ", format(origSD)) qqnorm(cX, main=sTitle2, ylab="X", ylim=c(minY, maxY)) qqline(cX)
print("Transformada") # Grafica transformacion con Desv. Tipica sTitle2 = paste("Tran. Box-Cox con SD min. QQPlot norm.\n(lambda = ", format(minLambda), ", Desv. Tip. = ", format(minSD), ")") qqnorm(cMinY, main=sTitle2, ylab="Y", ylim=c(minY, maxY)) qqline(cMinY)
print("Histograma") sTitle2 = paste(sTitle, "\nHistograma") hist(cX, main=sTitle2, xlab="X")
print("Lambda") # Grafica lambda vs. Desv. Tipica sTitle2 = paste("Lambda vs. Desv. Tipica.\n(lambda = ", format(minLambda), ", Desv. Tip. = ", format(minSD), ")") plot(rLambda, rSD, main=sTitle2, xlab="Lambda", ylab="log(SD)", log='y')
}
Listado S-Plus (4) # PARAMETROS DEL PROGRAMA # Inicializar archivo example = 5 n = 100 # Tamano de muestra
# Parametros de los ejemplos # El dominio debe ser X>0 if (example == 1) { print("Exp") lambda1 = 1 # Parámetro para exp sTitle = paste("Exponencial(", lambda1, ")")
leftLambda = -2 rightLambda = 2 eachLambda = 0.05 cXOrig = rexp(n, lambda1)
} else if (example == 2) { print("Exp") lambda1 = 3 # Parámetro para exp sTitle = paste("Exponencial(", lambda1, ")")
leftLambda = 0 rightLambda = 10 eachLambda = 0.05 cXOrig = rexp(n, lambda1)
Listado S-Plus (5) } else if (example == 3) { print("Unif") alfa = 0.01 # Parámetro para Unif beta = 1 # Parámetro para Unif sTitle = paste("Uniforme(", alfa, ", ", beta, ")")
leftLambda = -10 rightLambda = 10 eachLambda = 0.5 cXOrig = runif(n, min=alfa, max=beta) } else if (example == 4) { print("Unif") alfa = 1 # Parámetro para Unif beta = 5 # Parámetro para Unif sTitle = paste("Uniforme(", alfa, ", ", beta, ")")
leftLambda = -10 rightLambda = 10 eachLambda = 1 cXOrig = runif(n, min=alfa, max=beta) } else if (example == 5) { print("Beta") alfa = 5 # Parámetro para Unif beta = 2.5 # Parámetro para Unif sTitle = paste("Beta(", alfa, ", ", beta, ")")
leftLambda = -10 rightLambda = 10 eachLambda = 1 cXOrig = rbeta(n, alfa, beta) }
# Escribe en archivo una muestra aleatoria con distribucion exponencial cXOrig = t(cXOrig) cXOrig = t(cXOrig) # Dos veces para transponer renglon a columna (?) exportData(cXOrig, "D:\\Posada\\ModEst\\ModEst4\\ExpSample.txt", type="ASCII")
fX = importData("D:\\Posada\\ModEst\\ModEst4\\ExpSample.txt", type="ASCII") res = boxCox(fX, leftLambda, rightLambda, eachLambda) plotBoxCox(sTitle, res$cX, res$origSD, res$rLambda, res$rSD, res$cMinY, res$minLambda, res$minSD)
Listado S-Plus (6) # Escribe en archivo una muestra aleatoria con distribucion exponencial cXOrig = t(cXOrig) cXOrig = t(cXOrig) # Dos veces para transponer renglon a columna (?) exportData(cXOrig, "D:\\Posada\\ModEst\\ModEst4\\ExpSample.txt", type="ASCII")
fX = importData("D:\\Posada\\ModEst\\ModEst4\\ExpSample.txt", type="ASCII") res = boxCox(fX, leftLambda, rightLambda, eachLambda) plotBoxCox(sTitle, res$cX, res$origSD, res$rLambda, res$rSD, res$cMinY,
res$minLambda, res$minSD)