Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Las estimaciones no paramétricas de las funciones de distribución acumulativa y sus Inverses

Este ejemplo muestra cómo estimar la función de distribución acumulativa (CDF) a partir de los datos de una manera no paramétrica o semiparamétrica. También ilustra el método de inversión para generar números aleatorios de la CDF estimada. El™ de herramientas de estadísticas y aprendizaje automático incluye más de dos docenas de funciones de generador de números aleatorios para distribuciones paramétricas de probabilidad univariadas. Estas funciones le permiten generar entradas aleatorias para una amplia variedad de simulaciones, sin embargo, hay situaciones en las que es necesario generar valores aleatorios para simular datos que no son descritos por una familia paramétrica simple.

La caja de herramientas también incluye las funciones y, para generar valores aleatorios sin tener que especificar una distribución paramétrica desde la que dibujar--esas funciones le permiten especificar una distribución en términos de sus momentos o cuantiles, respectivamente.pearsrndjohnsrnd

Sin embargo, todavía hay situaciones en las que se necesita aún más flexibilidad, para generar valores aleatorios que "imitan" datos que usted ha recogido aún más de cerca. En este caso, puede utilizar una estimación no paramétrica del CDF de esos datos y utilizar el método de inversión para generar valores aleatorios. El método de inversión implica generar valores aleatorios uniformes en el intervalo unitario y transformarlos en una distribución deseada utilizando el CDF inverso para esa distribución.

Desde la perspectiva opuesta, a veces es deseable utilizar una estimación no paramétrica del CDF para transformar los datos observados en el intervalo unitario, dándoles una distribución uniforme aproximada.

La función calcula un tipo de estimación CDF no paramétrica, el CDF empírico, que es una función de paso de escalera.ecdf Este ejemplo ilustra algunas alternativas más suaves, que pueden ser más adecuadas para simular o transformar datos de una distribución continua.

Con el propósito de ilustrar, aquí hay algunos datos simulados simples. Sólo hay 25 observaciones, un pequeño número elegido para hacer las parcelas en el ejemplo más fácil de leer. Los datos también se ordenan para simplificar el trazado.

rng(19,'twister'); n = 25; x = evrnd(3,1,n,1); x = sort(x); hist(x,-2:.5:4.5); xlabel('x'); ylabel('Frequency'); 

Una estimación CDF no paramétrica lineal por tramos

La función proporciona una forma sencilla de calcular y trazar un CDF empírico "escalda" para los datos.ecdf En los casos más simples, esta estimación hace saltos discretos de 1/n en cada punto de datos.

[Fi,xi] = ecdf(x); stairs(xi,Fi,'r'); xlim([-2.5 5]); xlabel('x'); ylabel('F(x)'); 

Esta estimación es útil para muchos propósitos, incluyendo la investigación de la bondad de ajuste de un modelo paramétrico a los datos. Su discreción, sin embargo, puede hacer que sea inadecuado para su uso en la transformación empírica de datos continuos hacia o desde el intervalo unitario.

Es fácil modificar el CDF empírico para abordar esos problemas. En lugar de tomar saltos discretos de 1/n en cada punto de datos, defina una función que sea lineal por etapas, con puntos de rotura en los puntos medios de esos saltos. La altura en cada uno de los puntos de datos es entonces [1/2n, 3/2N,..., (n-1/2)/n], en lugar de [(1/n), (2/n),..., 1]. Utilice la salida de para calcular esos puntos de rotura y, a continuación, "conectar los puntos" para definir la función lineal por tramos.ecdf

xj = xi(2:end); Fj = (Fi(1:end-1)+Fi(2:end))/2; hold on plot(xj,Fj,'b.', xj,Fj,'b-'); hold off legend({'ECDF' 'Breakpoints' 'Piecewise Linear Estimate'},'location','NW'); 

Debido a que se ocupa apropiadamente de los valores repetidos y la censura, este cálculo funciona incluso en casos con datos más complicados que en este ejemplo.ecdf

Puesto que el punto de datos más pequeño corresponde a una altura de 1/2n, y el más grande a 1-1/2n, los segmentos lineales primero y último deben extenderse más allá de los datos, para hacer que la función alcance 0 y 1.

xj = [xj(1)-Fj(1)*(xj(2)-xj(1))/((Fj(2)-Fj(1)));       xj;       xj(n)+(1-Fj(n))*((xj(n)-xj(n-1))/(Fj(n)-Fj(n-1)))]; Fj = [0; Fj; 1]; hold on plot(xj,Fj,'b-','HandleVisibility','off'); hold off 

Esta función lineal por tramos proporciona una estimación no paramétrica de la CDF que es continua y simétrica. Evaluarlo en puntos que no sean los datos originales es sólo una cuestión de interpolación lineal, y puede ser conveniente definir una función anónima para hacerlo.

F = @(y) interp1(xj,Fj,y,'linear','extrap'); y = linspace(-1,3.75,10); plot(xj,Fj,'b-',y,F(y),'ko'); xlim([-2.5 5]); xlabel('x'); ylabel('F(x)'); 

Una estimación de CDF inversa no paramétrica lineal de Piecewise

Puede utilizar los mismos cálculos para calcular una estimación no paramétrica del CDF inverso. De hecho, la estimación de CDF inversa es sólo la estimación CDF con los ejes intercambiados.

stairs(Fi,[xi(2:end); xi(end)],'r'); hold on plot(Fj,xj,'b-'); hold off ylim([-2.5 5]); ylabel('x'); xlabel('F(x)'); legend({'ECDF' 'Piecewise Linear Estimate'},'location','NW'); 

La evaluación de este CDF inverso no paramétrico en puntos que no sean los puntos de rotura originales es sólo una cuestión de interpolación lineal. Por ejemplo, genere valores aleatorios uniformes y utilice la estimación CDF para transformarlos de nuevo a la escala de los datos observados originales. Este es el método de inversión.

Finv = @(u) interp1(Fj,xj,u,'linear','extrap'); u = rand(10000,1); hist(Finv(u),-2:.25:4.5); xlabel('x'); ylabel('Frequency'); 

Observe que este histograma de datos simulados está más extendido que el histograma de los datos originales. Esto se debe, en parte, al tamaño de la muestra mucho más grande--los datos originales constan de solo 25 valores. Pero también es porque la estimación de CDF lineal a trozos, en efecto, "se extiende" cada una de las observaciones originales en un intervalo, y más en las regiones donde las observaciones individuales están bien separadas.

Por ejemplo, las dos observaciones individuales a la izquierda de cero corresponden a una región plana y ancha de baja densidad en los datos simulados. Por el contrario, en las regiones en las que los datos están estrechamente espaciados, hacia la cola derecha, por ejemplo, la estimación de CDF lineal por tramos "extiende" las observaciones en menor medida. En ese sentido, el método realiza una versión simple de lo que se conoce como suavizado de ancho de banda variable. Sin embargo, a pesar del suavizado, los datos simulados conservan la mayoría de las idiosincrasias de los datos originales, es decir, las regiones de alta y baja densidad.

Estimadores de kernel para CDF y CDF inversa

En lugar de estimar el CDF utilizando una función lineal por etapas, puede realizar la estimación del kernel utilizando la función para hacer una estimación no paramétrica suave.ksdensity Aunque a menudo se utiliza para hacer una estimación no paramétrica, también puede estimar otras funciones.densityksdensity Por ejemplo, para transformar los datos originales al intervalo de unidades, utilítilos para estimar el CDF.

F = ksdensity(x, x, 'function','cdf', 'width',.35); stairs(xi,Fi,'r'); hold on plot(x,F,'b.'); hold off xlim([-2.5 5]); xlabel('x'); ylabel('F(x)'); legend({'ECDF' 'Kernel Estimates'},'location','NW'); 

también proporciona una forma cómoda de evaluar la estimación de CDF del kernel en puntos que no sean los datos originales.ksdensity Por ejemplo, trace la estimación como una curva suave.

y = linspace(-2.5,5,1000); Fy = ksdensity(x, y, 'function','cdf', 'width',.35); stairs(xi,Fi,'r'); hold on plot(y,Fy,'b-'); hold off legend({'ECDF' 'Kernel Estimate'},'location','NW'); 

utiliza un parámetro de ancho de banda para controlar la cantidad de suavizado en las estimaciones que calcula, y es posible dejar elegir un valor predeterminado.ksdensityksdensity Los ejemplos aquí utilizan un ancho de banda bastante pequeño para limitar la cantidad de suavizado. Aun así, la estimación del kernel no sigue al ECDF tan estrechamente como lo hace la estimación lineal por tramos.

Una manera de estimar el CDF inverso utilizando la estimación del kernel es computar la estimación CDF del kernel en una cuadrícula de puntos que abarque el rango de los datos originales, y luego usar el mismo procedimiento que para la estimación lineal por tramos. Por ejemplo, para trazar la estimación inversa del kernel CDF como una curva suave, simplemente intercambia los ejes.

stairs(Fi,[xi(2:end); xi(end)],'r'); hold on plot(Fy,y,'b-'); hold off ylim([-2.5 5]); ylabel('x'); xlabel('F(x)'); legend({'ECDF' 'Kernel Estimate'},'location','NW'); 

Para transformar valores aleatorios uniformes en la escala de los datos originales, interpolar utilizando la cuadrícula de estimaciones CDF.

Finv = @(u) interp1(Fy,y,u,'linear','extrap'); hist(Finv(u),-2.5:.25:5); xlabel('x'); ylabel('Frequency'); 

Observe que los datos simulados que utilizan la estimación CDF del kernel no han "suavizado" completamente las dos observaciones individuales a la izquierda de cero presentes en los datos originales. La estimación del kernel utiliza un ancho de banda fijo. Con el valor de ancho de banda particular utilizado en este ejemplo, esas dos observaciones contribuyen a dos áreas localizadas de densidad, en lugar de una región plana amplia, como fue el caso con la estimación lineal por tramos. Por el contrario, la estimación del kernel ha suavizado los datos en la cola derecha que la estimación lineal por tramos.more

Otra forma de generar datos simulados mediante la estimación del kernel es utilizar para calcular una estimación del CDF inverso directamente, usando de nuevo el parámetro.ksdensity'function' Por ejemplo, transforme esos mismos valores uniformes.

r = ksdensity(x, u, 'function','icdf', 'width',.35); 

Sin embargo, el uso de este último método puede consumir mucho tiempo para grandes cantidades de datos. Un método más simple, pero equivalente, es volver a muestrear con el reemplazo de los datos originales y agregar un poco de ruido aleatorio apropiado.

r = datasample(x,100000,'replace',true) + normrnd(0,.35,100000,1); 

Si genera suficientes valores aleatorios, un histograma del resultado sigue muy de cerca la estimación de la densidad del kernel de los datos originales.

binwidth = .25; edges = -2.5:binwidth:6; ctrs = edges(1:end-1) + binwidth./2; counts = histc(r,edges); counts = counts(1:end-1); bar(ctrs,counts./(sum(counts).*binwidth),1,'FaceColor',[.9 .9 .9]); hold on xgrid = edges(1):.1:edges(end); fgrid = ksdensity(x, xgrid, 'function','pdf', 'width',.3); plot(xgrid,fgrid,'k-'); hold off xlabel('x'); ylabel('f(x)'); 

Una estimación CDF semiparamétrica

Una estimación CDF no paramétrica requiere una buena cantidad de datos para lograr una precisión razonable. Además, los datos sólo afectan a la estimación "localmente." Es decir, en las regiones donde hay una alta densidad de datos, la estimación se basa en más observaciones que en regiones donde hay una baja densidad de datos. En particular, las estimaciones no paramétricas no funcionan bien en las colas de una distribución, donde los datos son escasos por definición.

El ajuste de un modelo semiparamétrico a sus datos mediante la función permite lo mejor de los mundos paramétricos y no paramétricos.paretotails En el "centro" de la distribución, el modelo utiliza la estimación no paramétrica lineal por tramos para la CDF. En cada cola, utiliza una distribución de Pareto generalizada. El Pareto generalizado se utiliza a menudo como modelo para la cola (s) de un DataSet, y aunque es lo suficientemente flexible para adaptarse a una amplia variedad de colas de distribución, está suficientemente restringido para que requiera pocos datos para proporcionar un ajuste plausible y suave a los datos de la cola.

Por ejemplo, puede definir el "centro" de los datos como medio 50% y especificar que las transiciones entre la estimación no paramétrica y el Pareto se realizan en los cuantiles .25 y. 75 de los datos. Para evaluar la CDF del ajuste del modelo semiparamétrico, utilice el método del ajuste.cdf

semipFit = paretotails(x,.25,.75); 
Warning: Problem fitting generalized Pareto distribution to upper tail. Maximum likelihood has converged to a boundary point of the parameter space.  

La advertencia se debe al uso de tan pocos datos--6 puntos en cada cola en este caso--e indica que la distribución de Pareto generalizada y ajustada en la cola superior se extiende exactamente a la observación más pequeña, y no más. Se puede ver en el histograma que se muestra a continuación. En una aplicación real, normalmente tendría más datos y la advertencia normalmente no se produciría.

[p,q] = boundary(semipFit); y = linspace(-4,6,1000); Fy = cdf(semipFit,y); plot(y,Fy,'b-', q,p,'k+'); xlim([-6.5 5]); xlabel('x'); ylabel('F(x)'); legend({'Semi-parametric Estimate' 'Segment Boundaries'},'location','NW'); 

Para transformar los valores aleatorios uniformes en la escala de los datos originales, utilice el método de ajuste.icdf

r = icdf(semipFit,u); hist(r,-6.5:.25:5); xlabel('x'); ylabel('Frequency'); 

Esta estimación semiparamétrica ha suavizado las colas de los datos más que el centro, debido al modelo paramétrico utilizado en las colas. En ese sentido, la estimación es más similar a la estimación lineal por tramos que a la estimación del kernel. Sin embargo, también es posible utilizar para crear un ajuste semiparamétrico que utiliza la estimación del kernel en el centro de los datos.paretotails

Conclusiones

Este ejemplo ilustra tres métodos para calcular un CDF no paramétrico o semiparamétrico o una estimación CDF inversa de los datos. Los tres métodos imponen diferentes cantidades y tipos de suavizado en los datos. El método que elija dependerá de cómo cada método Capture o falle al capturar lo que considere las características importantes de sus datos.