Intervalos de tolerancia no paramétricos para variables discretas

8

Supongamos que un grupo de personas evalúa cuánto les gustó una película en una escala discreta del 1 al 10, y desea un intervalo [ l , u ] tal que con (al menos) 95% de confianza, (al menos) 90 El% de todas las personas que ven la película lo calificarán no menos que l ni más alto que u . [ l , u ] es entonces un intervalo de tolerancia (de dos lados) con 95% de confianza y 90% de cobertura. (Para ser claros, el 95% de confianza implica que si repite este procedimiento muchas veces, el 95% de los intervalos producidos obtendrían al menos el 90% de cobertura de la población). Por supuesto, generalmente queremos que [ l , u ] sea tan estrecho como posible sin dejar de cumplir nuestros requisitos.

He visto varios métodos no paramétricos para construir intervalos de tolerancia para variables aleatorias continuas. También he visto métodos para construir intervalos de tolerancia para las variables binomiales y de Poisson. (El paquete R toleranceimplementa varios de estos métodos; Young, 2010.) ¿Pero qué pasa con las variables discretas cuando la distribución es desconocida? Este es generalmente el caso para escalas de calificación como la de mi ejemplo, y asumir que una distribución binomial no parece segura porque los datos reales de la escala de calificación a menudo exhiben rarezas como la multimodalidad.

¿Tendría sentido recurrir a los métodos no paramétricos para variables continuas? Alternativamente, ¿qué pasa con un método de Monte Carlo como generar 1,000 réplicas de arranque de la muestra y encontrar un intervalo que capture al menos el 90% de la muestra en al menos 950 de las réplicas?

Young, DS (2010). tolerancia: un paquete R para estimar los intervalos de tolerancia. Revista de software estadístico, 36 (5), 1-39. Recuperado de http://www.jstatsoft.org/v36/i05

Kodiólogo
fuente
¿te refieres a binomial o multinomial? multinomial permitiría un comportamiento multimodal?
seanv507
Me refiero a binomio. En el caso de una escala de calificación, por ejemplo, establecería el número de pruebas de Bernoulli en el número de puntos de escala. Los intervalos entre las categorías de una distribución multinomial no tendrían mucho sentido, creo, ya que las categorías no están ordenadas.
Kodiólogo
@Kodiologist su variable de resultado es una "escala discreta de 1 a 10", pero eso significa que es una respuesta multinomial ordenada. (¿O no obtengo algo?)
Jim
@Jim "Multinomio ordenado" es un poco un oxímoron. En una distribución multinomial, el orden de las categorías es arbitrario.
Kodiólogo

Respuestas:

1

La variable de interés se distribuye multinomialmente con probabilidades de clase (celda): . Además, las clases están dotadas de un orden natural.p1,p2,...,p10

Primer intento: el "intervalo predictivo" más pequeño que contiene90%

p     = [p1, ..., p10] # empirical proportions summing to 1
l     = 1
u     = length(p)
cover = 0.9

pmass = sum(p)

while (pmass - p[l] >= cover) OR (pmass - p[u] >= cover)
    if p[l] <= p[u]
       pmass = pmass - p[l]
       l     = l + 1  
    else # p[l] > p[u]
       pmass = pmass - p[u]
       u     = u - 1
    end        
end

Una medida no paramétrica de la incertidumbre (p. Ej., Varianza, confianza) en las estimaciones cuantitativas podría de hecho obtenerse mediante métodos de arranque estándar .l,u

Segundo enfoque: "búsqueda directa de arranque"

A continuación proporciono un código Matlab ejecutable que aborda la pregunta directamente desde una perspectiva de arranque (el código no está vectorizado de manera óptima).

%% set DGP parameters:
p = [0.35, 0.8, 3.5, 2.2, 0.3, 2.9, 4.3, 2.1, 0.4, 0.2];
p = p./sum(p); % true probabilities

ncat = numel(p);
cats = 1:ncat;

% draw a sample:
rng(1703) % set seed
nsamp = 10^3; 
samp  = datasample(1:10, nsamp, 'Weights', p, 'Replace', true);

Comprueba que esto tiene sentido.

psamp = mean(bsxfun(@eq, samp', cats)); % sample probabilities
bar([p(:), psamp(:)])

ingrese la descripción de la imagen aquí

Ejecute la simulación de arranque.

%% bootstrap simulation:
rng(240947)

nboots = 2*10^3;
cover  = 0.9;
conf   = 0.95;    

tic
Pmat = nan(nboots, ncat, ncat);
for b = 1:nboots

    boot  = datasample(samp, nsamp, 'Replace', true); % draw bootstrap sample    
    pboot = mean(bsxfun(@eq, boot', cats));      

    for l = 1:ncat
        for u = l:ncat
            Pmat(b, l, u) = sum(pboot(l:u));   
        end
    end

end
toc % Elapsed time is 0.442703 seconds.

El filtro de cada rutina de carga replica los intervalos, , que contienen al menos masa de probabilidad y calcula una estimación de confianza (frecuente) de esos intervalos.[l,u]90%

conf_mat = squeeze(mean(Pmat >= cover, 1))

     0         0         0         0         0         0         0    1.0000    1.0000    1.0000
     0         0         0         0         0         0         0    1.0000    1.0000    1.0000
     0         0         0         0         0         0         0    0.3360    0.9770    1.0000
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0

Seleccione aquellos que satisfagan el deseo de confianza.

[L, U] = find(conf_mat >= conf);
[L, U]

 1     8
 2     8
 1     9
 2     9
 3     9
 1    10
 2    10
 3    10

Convenciéndose de que el método de arranque anterior es válido

Las muestras de Bootstrap están destinadas a ser sustitutos de algo que nos gustaría tener, pero no lo hacemos, es decir: nuevos e independientes extractos de la verdadera población subyacente (en resumen: nuevos datos).

En el ejemplo que di, conocemos el proceso de generación de datos (DGP), por lo tanto, podríamos "engañar" y reemplazar las líneas de código pertenecientes a las muestras de arranque por nuevos sorteos independientes del DGP real.

newsamp = datasample(cats, nsamp, 'Weights', p, 'Replace', true);
pnew    = mean(bsxfun(@eq, newsamp', cats));

Entonces podemos validar el enfoque bootstrap comparándolo con el ideal. Debajo están los resultados.

La matriz de confianza de datos nuevos e independientes extrae:

     0         0         0         0         0         0         0    1.0000    1.0000    1.0000
     0         0         0         0         0         0         0    1.0000    1.0000    1.0000
     0         0         0         0         0         0         0    0.4075    0.9925    1.0000
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0
     0         0         0         0         0         0         0         0         0         0

Los correspondientes límites inferior y superior del confianza:95%

 1     8
 2     8
 1     9
 2     9
 3     9
 1    10
 2    10
 3    10

Encontramos que las matrices de confianza están muy de acuerdo y que los límites son idénticos ... Validando así el enfoque de arranque.

Jim
fuente
2
Los intervalos de tolerancia y los intervalos de confianza son cosas diferentes. En realidad, lo que ha descrito no es un intervalo de confianza, sino un intervalo de predicción, que es otro tipo distinto de intervalo.
Kodiologist
1
Su edición parece ser una implementación de lo que quise decir cuando escribí "un método de Monte Carlo como generar 1,000 réplicas de arranque de la muestra y encontrar un intervalo que capture al menos el 90% de la muestra en al menos 950 de las réplicas". Aunque intuitivo, no estoy seguro de que esto realmente funcione o tenga sentido, por eso creé esta pregunta.
Kodiologist
@Kodiologist La respuesta ahora contiene una sección que valida el enfoque bootstrap. Por supuesto, esto podría llevarse más lejos, por ejemplo, anidado en bucles sobre el tamaño de la muestra y las probabilidades de clase.
Jim
Demostrar que el método bootstrap es correcto para este problema en toda su generalidad significa demostrar que tiene la confianza y la cobertura correctas independientemente de la distribución previa de parámetros (después de todo, es un método frecuente). Para eso, creo, la simulación no sería suficiente; necesitarías una prueba matemática. Pero has sido notablemente persistente y has demostrado que el bootstrap funciona al menos algunas veces, por lo que mereces una A por esfuerzo.
Kodiólogo