normalized histfit fitting fit bar matlab plot histogram distribution

histfit - pdf matlab



Matlab: trazando la distribuciĆ³n de frecuencia con una curva (2)

¿Qué hay de interpolar con splines ?

nbins = 10; %// number of bins for original histogram n_interp = 500; %// number of values for interpolation [counts, bins] = hist(data, nbins); bins_interp = linspace(bins(1), bins(end), n_interp); counts_interp = interp1(bins, counts, bins_interp, ''spline''); plot(bins, counts) %// original histogram figure plot(bins_interp, counts_interp) %// interpolated histogram

Ejemplo: let

data = randn(1,1e4);

Histograma original:

Interpolado

Siguiendo su código, el eje y en las figuras de arriba da el recuento , no la densidad de probabilidad . Para obtener la densidad de probabilidad necesita normalizar:

normalization = 1/(bins(2)-bins(1))/sum(counts); plot(bins, counts*normalization) %// original histogram plot(bins_interp, counts_interp*normalization) %// interpolated histogram

Comprobar: el área total debe ser aproximadamente 1:

>> trapz(bins_interp, counts_interp*normalization) ans = 1.0009

Tengo que trazar 10 distribuciones de frecuencia en un gráfico. Para mantener las cosas ordenadas, me gustaría evitar hacer un histograma con contenedores y preferiría tener líneas que sigan el contorno de cada gráfico de histograma.

Intenté lo siguiente

[counts, bins] = hist(data); plot(bins, counts)

Pero esto me da una línea muy inexacta e irregular.

Leí sobre ksdensity, que me da una buena curva, pero cambia la escala de mi eje y y necesito poder leer las frecuencias del eje y.

¿Puedes recomendar algo más?


Está utilizando el número predeterminado de contenedores para su histograma y, supongo, para sus cálculos de estimación de la densidad del kernel.

Dependiendo de cuántos puntos de datos tenga, eso ciertamente no será óptimo, como ha descubierto. Lo primero que debe intentar es calcular el ancho óptimo de la bandeja para obtener la curva más suave y al mismo tiempo preservar el PDF subyacente de la mejor manera posible. (ver también aquí , aquí y aquí );

Si todavía no le gusta la suavidad de la trama resultante, puede intentar usar la salida de los bins de hist como una entrada adicional a ksdensity . Quizás algo como esto:

[kcounts,kbins] = ksdensity(data,bins,''npoints'',length(bins));

No tengo sus datos, por lo que puede tener que jugar un poco con los parámetros para obtener exactamente lo que desea.

Alternativamente, podrías intentar ajustar una spline través de los puntos que obtienes de hist y trazar eso en su lugar.

Cierto código:

data = randn(1,1e4); optN = sshist(data); figure(1) [N,Center] = hist(data); [Nopt,CenterOpt] = hist(data,optN); [f,xi] = ksdensity(data,CenterOpt); dN = mode(diff(Center)); dNopt = mode(diff(CenterOpt)); plot(Center,N/dN,''.-'',CenterOpt,Nopt/dNopt,''.-'',xi,f*length(data),''.-'') legend(''Default'',''Optimum'',''ksdensity'')

El resultado:

Tenga en cuenta que el ancho de contenedor "óptimo" conserva parte de la estructura fina de la distribución (tuve que ejecutar esto un par de veces para obtener los picos) mientras que el ksdensity proporciona una curva suave. Dependiendo de lo que esté buscando en sus datos, eso puede ser bueno o malo.