6 votos

Generar la distribución basada en la estadística descriptiva

Hay una variable oculta que me gustaría aproximado. Conozco a varias de las estadísticas de resumen: mínimo, máximo, media, mediana, desviación estándar, n; y que es aproximadamente normal.

Yo, obviamente, puede hacer un plano de la distribución normal dada la media y la desviación estándar, pero sé que es un poco sesgada y limitada de las colas. Obviamente mi aproximación no será perfecto, pero más cerca. Probablemente voy a implementar en R, pero las sugerencias no están vinculados a plataformas son apreciados.

Ejemplo:

Xbar <- 101.73
Xmedian <- 97.7
Xs <- 20.45 (standard deviation)
Xmin <- 50
Xmax <- 160
n <- 148

2voto

guest47 Puntos 186

Debe especificar un modelo. Usted no puede estimar el modelo o generar una función de distribución dada las estadísticas de resumen. Si usted tenía los datos, podría, en el mejor de los no-paramétrico de estimación, por ejemplo, bootstrap o estimación de densidad. Sin los datos reales no se puede hacer ningún no-paramétrico de procedimiento, debe especificar un modelo paramétrico. Dado que disponemos de la muestra momentos, le sugiero que elija un modelo y utilizar el método de los momentos para la estimación de la misma. Si usted no sabe nada más allá de que es más o menos normal sólo tiene que utilizar una distribución normal, como usted no tiene ninguna justificación para el uso de cualquier otra cosa.

2voto

Usted podría utilizar una mezcla de las normales. Elija el número más pequeño de componentes que usted obtiene lo suficientemente cerca como para la distribución de la que tiene en mente. "Lo suficientemente cerca" es un asunto que para su juicio. He aquí un ejemplo.

# Parameters of the mixture
p1 = 0.6
m1 = 95
s1 = 6
m2 = 103
s2 = 26

# Number of obs.
n = 148

# Draw the component indicators
set.seed(31337)
mix_indicator = rep(1,n)
mix_indicator[which(runif(n) > p1)] = 2

# Draw the normals
draws = rnorm(n)*s1 + m1
draws[which(mix_indicator==2)] = rnorm(sum(mix_indicator==2))*s2 + m2

print(mean(draws))    # 100.9
print(median(draws))  # 97.1
print(sqrt(var(draws)))  # 18.4
print(min(draws))     # 49
print(max(draws))     # 175

2voto

wannymahoots Puntos 388

Si lo que desea es una distribución que se ve aproximadamente normal y que satisfaga sus estadísticas descriptivas, aquí es un enfoque posible. Comience con una distribución normal de la muestra de 148 números y aplicar una serie de transformaciones (aproximadamente) satisfacer las estadísticas descriptivas. Por supuesto, hay muchas distribuciones que podría satisfacer el problema...

# function for descriptive stats
stats = function(x)  c(min(x),max(x),median(x),mean(x),sd(x))

# simple power transformation (hold min and max constant)
pow = function(x,lam) {
   t = (x-min(x))^lam
   (t/max(t))*(max(x)-min(x))+min(x)
}

# power transform of upper and lower halves of data (hold min,max,median constant)
pow2 = function(par, x) {
    m = median(x)
    t1 = pow(m-x[1:74], par[1])
    t2 = pow(x[75:148]-m, par[2])
    c(m-t1, t2+m)
}


# transformation to fit minimum and maximum
t1 = function(x) {
   x = ((x-min(x))/diff(range(x)) *110) + 50
}

# optimise power transformation match median
t2 = function(x) {
   l = optimise(function(l) { (median(pow(x,l))-97.7)^2 }, c(-5,5))$min
   pow(x,l)
}

# optimise power transformation of upper and lower halves to fit mean and sd
t3 = function(x) {
    l2 = optim(c(1,1), function(par) { 
       r = pow2(par,x); (mean(r)-101.73)^2 + (sd(r)-20.45)^2 })$par
    pow2(l2, x)
}

d = t1(sort(rnorm(148)))
stats(d)
d = t2(d)
stats(d)
d = t3(d)
stats(d) # result should match your descriptive stats
hist(d)  # looks normal-ish

# repeat and plot many distributions that satisfy requirements
plot(d,cumsum(d), type="l")
for(n in 1:500) { 
   d = t3(t2(t1(sort(rnorm(148)))))
   lines(d,cumsum(d), col=rgb(1,0,0,0.05))
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X