2011-06-26 13 views
5

para adaptarse a un conjunto de datos de números de valor real (x) con una distribución, podemos uso masivo de la siguiente manera, ya sea el gamma o Student's t distribución:R: ¿Cómo ajustar un gran conjunto de datos con una combinación de distribuciones?

fitdistr(x, "gamma") 

o

fitdistr(x2, "t") 

¿Qué pasa si creen mi conjunto de datos debe ajustarse por la suma de distribuciones gamma yt?

P(X) = Gamma(x) + t(x) 

¿Se pueden ajustar los parámetros de las mezclas de distribuciones de probabilidad usando el ajuste de Máxima Verosimilitud en R?

+2

supongo que te refieres (como también se han asumido los otros carteles) que su distribución es una mezcla * * de Gamma y t (es decir, que cada punto individual es extraído de las distribuciones Gamma o t). La otra alternativa, que es un poco más complicada, es que (como yo pensaría si leo su pregunta literalmente) que los valores individuales son sumas de variables Gamma yt, es decir, que la distribución es una convolución de Gamma y t. Por favor aclara Si es lo último, puedo sugerir una solución usando el paquete 'distr' ... –

+0

Más de dos años después y no el póster original, pero estaría muy interesado en la solución propuesta para la convolución usando el' distr' paquete. – msp

Respuesta

3

Hay analítica maximum-likelihood estimators para algunos parámetros, como la media de normal distribution o la tasa de exponential distribution. Para otros parámetros, no hay un estimador analítico, pero puede usar numerical analysis para encontrar estimaciones de parámetros razonables.

La función fitdistr() en R utiliza la optimización numérica de la función de verosimilitud de log llamando a la función optim(). Si crees que tus datos son una mezcla de Gamma y distribución t, simplemente haz una función de probabilidad que describa esa mezcla. Luego, pase esos valores de los parámetros a optim() para la optimización. Este es un ejemplo de usar este enfoque para el ajuste de una distribución:

library(MASS) 

vals = rnorm(n = 10000, mean = 0, sd = 1) 
print(summary(x_vals)) 

ll_func = function(params) { 
    log_probs = log(dnorm(x = vals, mean = params[1], sd = params[2])) 
    tot = sum(log_probs) 
    return(-1 * tot) 
}  

params = c(0.5, 10) 

print(ll_func(params)) 
res = optim(params, ll_func) 
print(res$par) 

La ejecución de este programa en R produce esta salida:

[1] "mean: 0.0223766157516646" 
[1] "sd: 0.991566611447471" 

Eso es bastante cerca de los valores iniciales de media = 0 y sd = 1

No olvide que con una mezcla de dos distribuciones, tiene un parámetro adicional que especifica los pesos relativos entre las distribuciones. Además, tenga cuidado con la instalación de muchos parámetros a la vez. Con muchos parámetros gratuitos, debe preocuparse por overfitting.

Cuestiones relacionadas