10 votos

Cómo encontrar un intervalo de confianza para el número total de eventos

Tengo un detector que detectará un evento con cierta probabilidad p . Si el detector dice que se ha producido un evento, siempre es así, por lo que no hay falsos positivos. Después de ejecutarlo durante algún tiempo, obtengo k eventos detectados. Me gustaría calcular cuál fue el número total de eventos que se produjeron, detectados o no, con cierta confianza, digamos el 95%.

Así que, por ejemplo, digamos que tengo 13 eventos detectados. Me gustaría poder calcular que hubo entre 13 y 19 eventos con un 95% de confianza basándome en p .

Esto es lo que he probado hasta ahora:

La probabilidad de detectar k eventos si hubiera n total es:

binomial(n, k) * p^k * (1 - p)^(n - k)

La suma de eso sobre n de k hasta el infinito es:

1/p

Lo que significa que la probabilidad de que haya n el total de eventos es:

f(n) = binomial(n, k) * p^(k + 1) * (1 - p)^(n - k)

Así que si quiero estar 95% seguro debo encontrar la primera suma parcial f(k) + f(k+1) + f(k+2) ... + f(k+m) que es al menos 0,95 y la respuesta es [k, k+m] . ¿Es este el enfoque correcto? ¿Existe también una fórmula cerrada para la respuesta?

12voto

reconbot Puntos 1670

Yo elegiría utilizar el distribución binomial negativa que devuelve la probabilidad de que haya X fallos antes del kº éxito, cuando la probabilidad constante de un éxito es p.

Utilizando un ejemplo

k=17 # number of successes
p=.6 # constant probability of success

la media y la sd de los fallos vienen dadas por

mean.X <- k*(1-p)/p
sd.X <- sqrt(k*(1-p)/p^2) 

La distribución de los fallos X, tendrá aproximadamente esa forma

plot(dnbinom(0:(mean.X + 3 * sd.X),k,p),type='l')

Por lo tanto, el número de fallos será (con un 95% de confianza) aproximadamente entre

qnbinom(.025,k,p)
[1] 4

y

qnbinom(.975,k,p)
[1] 21

Así que su inerval sería [k+qnbinom(.025,k,p),k+qnbinom(.975,k,p)] (usando los números del ejemplo [21,38] )

5voto

Sam Puntos 234

Suponiendo que se quiera elegir una distribución para n, p(n) se puede aplicar la ley de Bayes.

Usted sabe que la probabilidad de que se produzcan k eventos dado que se han producido n se rige por una distribución binomial

$p(k|n) = {n \choose k} p^k (1-p)^{(n-k)}$

Lo que realmente quieres saber es la probabilidad de que se hayan producido realmente n sucesos, dado que has observado k. Por la vía de Bayes:

$p(n|k) = \frac{p(k|n)p(n)}{p(k)}$

Aplicando el teorema de la probabilidad total, podemos escribir:

$p(n|k) = \frac{p(k|n)p(n)}{\sum_{n'} p(k|n')p(n')}$

Así que sin más información, sobre la distribución de $p(n)$ no puedes ir más allá.

Sin embargo, si quiere elegir una distribución para $p(n)$ para el que existe un valor $n$ mayor que el que $p(n) = 0$ o lo suficientemente cerca de cero, entonces puedes hacerlo un poco mejor. Por ejemplo, supongamos que la distribución de $n$ es uniforme en el rango $[0,n_{max}]$ . este caso:

$p(n) = \frac{1}{n_{max}}$

La formulación bayesiana se simplifica a:

$p(n|k) = \frac{p(k|n)}{\sum_{n'} p(k|n')}$

En cuanto a la parte final del problema, estoy de acuerdo en que el mejor enfoque es realizar una suma acumulativa sobre $p(n|k)$ para generar la función de distribución de la probabilidad acumulada, e iterar hasta alcanzar el límite de 0,95.

Dado que esta pregunta migró desde SO, a continuación se adjunta un código de muestra de juguete en python

import numpy.random

p = 0.8
nmax = 200

def factorial(n):
    if n == 0:
        return 1
    return reduce( lambda a,b : a*b, xrange(1,n+1), 1 )

def ncr(n,r):
    return factorial(n) / (factorial(r) * factorial(n-r))

def binomProbability(n, k, p):
    p1 = ncr(n,k)
    p2 = p**k
    p3 = (1-p)**(n-k)
    return p1*p2*p3

def posterior( n, k, p ):
    def p_k_given_n( n, k ):
        return binomProbability(n, k, p)
    def p_n( n ):
        return 1./nmax
    def p_k( k ):
        return sum( [ p_n(nd)*p_k_given_n(nd,k) for nd in range(k,nmax) ] )
    return (p_k_given_n(n,k) * p_n(n)) / p_k(k)

observed_k   = 80
p_n_given_k  = [ posterior( n, observed_k, p ) for n in range(0,nmax) ]
cp_n_given_k = numpy.cumsum(p_n_given_k)
for n in xrange(0,nmax):
    print n, p_n_given_k[n], cp_n_given_k[n]

3voto

doekman Puntos 5187

Sólo soy un "entusiasta de la geometría algebraica", así que mis consejos deben tomarse con pinzas. Dicho esto, aquí hay algunas cosas agradables para leer una vez que hayas dominado Hartshorne.

1) Soy un gran fan de "Curves on an algebraic surface" de Mumford como "segundo" libro de geometría algebraica.

2) "Toric Varieties" de Fulton es también muy agradable y legible, y dará acceso a algunos buenos ejemplos (muchos principiantes no parecen conocer suficientes ejemplos explícitos con los que trabajar).

3) Más cosas sobre curvas algebraicas. El mejor libro aquí sería "Geometry of Algebraic Curvas Algebraicas" de Arbarello, Cornalba, Griffiths y Harris. El siguiente paso sería aprender algo sobre el espacio de moduli de las curvas. Una opción inspiradora sería "Moduli of Curves", de Harris y Morrison.

4) Teoría de la intersección. El libro de Fulton es muy agradable y legible.

5) Grupos algebraicos. Aquí soy un gran fan del libro de Springer, aunque está escrito en el lenguaje de las variedades en lugar de los esquemas.

EDIT : Se me olvidó mencionar el libro de Kollar sobre resoluciones de singularidades. ¡Una obra maestra de la exposición!

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