Estoy viendo la muestra de curtosis de una variable aleatoria bastante sesgada, y los resultados parecen inconsistentes. Para ilustrar simplemente el problema, miré la curtosis de muestra de un RV log-normal. En R (que estoy aprendiendo lentamente):
library(moments);
samp_size = 2048;
n_trial = 4096;
kvals <- rep(NA,1,n_trial); #preallocate
for (iii in 1:n_trial) {
kvals[iii] <- kurtosis(exp(rnorm(samp_size)));
}
print(summary(kvals));
El resumen que obtengo es
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.87 28.66 39.32 59.17 61.70 1302.00
Según Wikipedia , la curtosis para este RV logarítmico normal debería estar alrededor de 114. Claramente, la curtosis de la muestra está sesgada.
Al investigar un poco, descubrí que la curtosis de la muestra está sesgada para tamaños de muestra pequeños. Utilicé el estimador 'G2' provisto por el e1071
paquete en CRAN, y obtuve resultados muy similares para este tamaño de muestra.
La pregunta : cuál de los siguientes caracteriza lo que está sucediendo:
- El error estándar de la curtosis de muestra es simplemente muy grande para este RV (aunque la estimación común del error estándar es del orden ). Alternativamente, utilicé muy pocas muestras (2048) en este estudio.
- Estas implementaciones de la curtosis de la muestra adolecen de problemas numéricos que pueden corregirse, por ejemplo, con el método de Terriberry (de la misma manera que el método de Welford da mejores resultados que el método ingenuo para la varianza de la muestra).
- Calculé la curtosis de la población de forma incorrecta. (Ay)
- La curtosis de muestra está sesgada de forma inherente y nunca se puede arreglar para tamaños de muestra tan pequeños.
r
unbiased-estimator
kurtosis
shabbychef
fuente
fuente
;
en los extremos de sus declaraciones. Hiciste bien en la preasignación, pero no hay necesidad de llenarNA
,kvals <- numeric(length = n_trial)
habría sido suficiente. Conrep
, solo necesita argumentos 1 y 3 de su llamada (por ejemplorep(NA, 10)
). En lafor
configuración del bucle,1:n_trial
puede ser peligroso si se programa; mejor esseq_along(kvals)
oseq_len(n_trial)
en este caso. Finalmente, si no necesita forzar la impresión, suelte laprint()
rondasummary()
; solo la necesitaría si no estuviera trabajando interactivamente con R. HTH.print
. Los argumentos arep
eran ciertamente erróneos.Respuestas:
Hay una corrección de sesgo . No es enorme Creo que la varianza muestral de la curtosis es proporcional al octavo (!) Momento central, que puede ser enorme para una distribución lognormal. Necesitaría millones de pruebas (o mucho más) en una simulación para detectar sesgos a menos que el CV sea pequeño. (Trace un histograma de kvals para ver cuán extraordinariamente sesgadas están).
La curtosis correcta es de hecho alrededor de 113.9364.
En lo que respecta al estilo R, puede ser conveniente encapsular la simulación en una función para que pueda modificar fácilmente el tamaño de la muestra o el número de ensayos.
fuente
e1071
da la corrección de sesgo 'estándar'; ver cran.r-project.org/web/packages/e1071/e1071.pdf . El uso de este estimador en lugar de g2, implementado por elmoments
paquete, tuvo poco efecto, como señalé en la Q. La dependencia del octavo momento implicaría que el tamaño de la muestra es demasiado pequeño aquí.[Solo en el estilo R - @whuber ha respondido la Kurtsosis Q]
Esto fue un poco complicado para dejar un comentario. Para bucles tan simples como el que usa, podemos combinar la sugerencia de @ whuber de encapsular la simulación en una función con la
replicate()
función.replicate()
se encarga de la asignación y ejecuta el ciclo por usted. A continuación se da un ejemplo:Lo usamos así:
Tenga en cuenta que uso la
rlnorm()
función para generar la variable aleatoria log-normal. Es equivalente aexp(rnorm())
en su ciclo pero usa la herramienta correcta, y permitimos que nuestra función pase los parámetros especificados por el usuario de la distribución log-normal.fuente
set.seed
, lo que ayudaría en ejemplos como este. ¿Hay alguna razón sustancial para encapsular en una función ( por ejemplo, el intérprete R precompilará funciones, por lo tanto, hay una aceleración), o es estilística ( por ejemplo, encapsular funciones, como el brócoli, es bueno para usted), o en algún punto intermedio ( por ejemplo, hay muchos operadores en R que actúan sobre las funciones, por lo que uno debería acostumbrarse a la programación funcional).source('foo.r')