Domanda

Per n di grandi dimensioni (vedi sotto per sapere cosa è abbastanza grande), è sicuro trattare, secondo il teorema del limite centrale, la distribuzione del campione medio come normale (gaussiano) ma io ' d piace una procedura che dia un intervallo di confidenza per qualsiasi n . Il modo per farlo è usare una distribuzione Student T con gradi di libertà n-1 .

Quindi la domanda è, dato un flusso di punti dati che raccogli o incontri uno alla volta, come calcolare un c (ad esempio, c = .95 ) intervallo di confidenza sulla media dei punti dati (senza memorizzare tutti i dati rilevati in precedenza)?

Un altro modo per chiederlo è: come tenere traccia del primo e del secondo momento di un flusso di dati senza archiviare l'intero flusso?

DOMANDA BONUS: puoi tenere traccia dei momenti più elevati senza memorizzare l'intero flusso?

È stato utile?

Soluzione 2

[Grazie enormi a John D Cook per gran parte di ciò che ho imparato nel mettere insieme questa risposta!]

Innanzitutto, ecco il motivo per non utilizzare la somma dei quadrati: http: //www.johndcook.com/blog/2008/09/26/

Cosa invece dovresti fare:

Tieni traccia del conteggio (n), della media (u) e delle quantità da cui è possibile determinare la varianza del campione e l'errore standard. (Adattato da http://www.johndcook.com/standard_deviation.html .)

Inizializza n = u = s = 0 .

Per ogni nuovo punto dati, x :

u0 = u;
n ++;
u += (x - u) / n;
s += (x - u0) * (x - u);

La varianza del campione è quindi s / (n-1) , la varianza della media del campione è s / (n-1) / n e lo standard l'errore della media del campione è SE = sqrt (s / (n-1) / n) .

Resta da calcolare l'intervallo di confidenza Student-t c ( c in (0,1)):

u [plus or minus] SE*g((1-c)/2, n-1)

dove g è il cdf inverso (aka quantile) della distribuzione Student-t con media 0 e varianza 1, prendendo una probabilità e i gradi di libertà (uno in meno del numero di punti dati ):

g(p,df) = sign(2*p-1)*sqrt(df)*sqrt(1/irib(1, -abs(2*p-1), df/2, 1/2) - 1)

dove irib è la funzione beta incompleta regolarizzata inversa:

irib(s0,s1,a,b) = z such that rib(s0,z,a,b) = s1

dove rib è la funzione beta incompleta regolarizzata:

rib(x0,x1,a,b) = B(x0,x1,a,b) / B(a,b)

dove B (a, b) è la funzione beta di Eulero e B (x0, x1, a, b) è la funzione beta incompleta:

B(a,b) = Gamma(a)*Gamma(b)/Gamma(a+b) = integral_0^1 t^(a-1)*(1-t)^(b-1) dt
B(x0,x1,a,b) = integral_x0^x1 t^(a-1)*(1-t)^(b-1) dt

Tipiche librerie numeriche / statistiche avranno implementazioni della funzione beta (o direttamente il cdf inverso della distribuzione Student-t). Per C, lo standard di fatto è la Gnu Scientific Library (GSL). Spesso viene fornita una versione a 3 argomenti della funzione beta; la generalizzazione in 4 argomenti è la seguente:

B(x0,x1,a,b) = B(x1,a,b) - B(x0,a,b)
rib(x0,x1,a,b) = rib(x1,a,b) - rib(x0,a,b)

Infine, ecco un'implementazione in Mathematica:

(* Take current {n,u,s} and new data point; return new {n,u,s}. *)
update[{n_,u_,s_}, x_] := {n+1, u+(x-u)/(n+1), s+(x-u)(x-(u+(x-u)/(n+1)))}

Needs["HypothesisTesting`"];
g[p_, df_] := InverseCDF[StudentTDistribution[df], p]

(* Mean CI given n,u,s and confidence level c. *)
mci[n_,u_,s_, c_:.95] := With[{d = Sqrt[s/(n-1)/n]*g[(1-c)/2, n-1]}, 
  {u+d, u-d}]

Confronta con

StudentTCI[u, SE, n-1, ConfidenceLevel->c]

oppure, quando è disponibile l'intero elenco di punti dati,

MeanCI[list, ConfidenceLevel->c]

Infine, se non vuoi caricare librerie matematiche per cose come la funzione beta, puoi hardcodificare una tabella di ricerca per -g ((1-c) / 2, n-1) . Qui è per c = .95 e n = 2..100 :

12.706204736174698, 4.302652729749464, 3.182446305283708, 2.7764451051977934, 2.570581835636314, 2.4469118511449666, 2.3646242515927853, 2.306004135204168, 2.262157162798205, 2.2281388519862735, 2.2009851600916384, 2.178812829667226, 2.1603686564627917, 2.1447866879178012, 2.131449545559774, 2.1199052992212533, 2.1098155778333156, 2.100922040241039, 2.093024054408307, 2.0859634472658626, 2.0796138447276835, 2.073873067904019, 2.0686576104190477, 2.0638985616280254, 2.0595385527532963, 2.05552943864287, 2.051830516480281, 2.048407141795243, 2.0452296421327034, 2.042272456301236, 2.039513446396408, 2.0369333434600976, 2.0345152974493392, 2.032244509317719, 2.030107928250338, 2.0280940009804462, 2.0261924630291066, 2.024394163911966, 2.022690920036762, 2.0210753903062715, 2.0195409704413745, 2.018081702818439, 2.016692199227822, 2.0153675744437627, 2.0141033888808457, 2.0128955989194246, 2.011740513729764, 2.0106347576242314, 2.0095752371292335, 2.0085591121007527, 2.007583770315835, 2.0066468050616857, 2.005745995317864, 2.0048792881880577, 2.004044783289136, 2.0032407188478696, 2.002465459291016, 2.001717484145232, 2.000995378088259, 2.0002978220142578, 1.9996235849949402, 1.998971517033376, 1.9983405425207483, 1.997729654317692, 1.9971379083920013, 1.9965644189523084, 1.996008354025304, 1.9954689314298386, 1.994945415107228, 1.9944371117711894, 1.9939433678456229, 1.993463566661884, 1.9929971258898527, 1.9925434951809258, 1.992102154002232, 1.9916726096446793, 1.9912543953883763, 1.9908470688116922, 1.9904502102301198, 1.990063421254452, 1.989686323456895, 1.9893185571365664, 1.9889597801751728, 1.9886096669757192, 1.98

Altri suggerimenti

Ecco un articolo su come calcolare la media e la deviazione standard in un unico passaggio , non memorizzare alcun dato. Dopo aver ottenuto queste due statistiche, è possibile stimare un intervallo di confidenza. Un intervallo di confidenza del 95% sarebbe [media - 1,96 * stdev, media + 1,96 * stdev], ipotizzando una distribuzione normale per i tuoi dati e un gran numero di punti dati.

Per un numero inferiore di punti dati, l'intervallo di confidenza sarebbe [mean - c (n) * stdev, mean + c (n) * stdev] dove c (n) dipende dalle dimensioni del campione e dal livello di confidenza. Per un livello di confidenza del 95%, ecco i tuoi valori di c (n) per n = 2, 3, 4, ..., 30

12.70620, 4.302653, 3.182446, 2.776445, 2.570582, 2.446912, 2.364624, 2.306004, 2.262157, 2.228139, 2.200985, 2.178813, 2.160369, 2.144787, 2.131450, 2.119905, 2.109816, 2.100922 2.0 2.0924 2.085 2.0 , 2.059539, 2.055529, 2.051831, 2.048407, 2.045230

Questi numeri sono g (0,025, n-1) dove g è il CDF inverso della distribuzione t con n gradi di libertà. Se si desidera un intervallo di confidenza del 99%, sostituire 0,025 con 0,005. In generale, per un livello di confidenza di 1-alpha, usa alpha / 2.

Ecco il R che ha generato le costanti sopra.

n = seq(2, 30); qt(0.025, n-1)

Ecco un post di blog che spiega perché i numeri sopra non sono vicini a 1,96 come ci si potrebbe aspettare.

   sigma = sqrt( (q - (s*s/n)) / (n-1) )
   delta = t(1-c/2,n-1) * sigma / sqrt(n)

Dove t (x, n-1) è la distribuzione t con n-1 gradi di libertà. se stai utilizzando gsl

t = gsl_cdf_tdist_Qinv (c/2.0, n-1)

Non è necessario memorizzare alcun dato oltre la somma dei quadrati. Ora, potresti avere un problema numerico perché la somma dei quadrati può essere piuttosto grande. Puoi usare la definizione alternativa di s

sigma = sqrt(sum(( x_i - s/n )^2 / (n-1)))

e fai due passaggi. Vorrei incoraggiarvi a prendere in considerazione l'uso di gnu scientific library o un pacchetto come R per aiutarti ad evitare problemi numerici. Inoltre, fai attenzione al tuo uso del teorema del limite centrale. L'abuso di questo è in parte responsabile di tutta la crisi finanziaria in atto proprio ora.

Non vuoi accumulare la somma dei quadrati. Le statistiche risultanti sono numericamente inaccurate - finirai per sottrarre due grandi numeri simili. Vuoi mantenere la varianza, o (n-1) * varianza, o qualcosa del genere.

Il modo più semplice è quello di accumulare i punti dati in modo incrementale. La formula non è complicata o difficile da ottenere (consultare il link di John D. Cook).

Un modo ancora più accurato per farlo è combinare i punti dati in modo ricorsivo a coppie. Puoi farlo con la memoria logaritmica in n: register k contiene statistiche per 2 ^ k punti dati più vecchi, che sono combinati con statistiche per 2 ^ k punti più recenti per ottenere statistiche per 2 ^ (k + 1) punti ...

Penso che non devi preoccuparti così tanto della dimensione di n perché presto supererà il numero di 30, dove la distribuzione può essere considerata normale. Usare la ricorsione bayesiana per fare inferenza posteriore sulla media della popolazione e i parametri di varianza, assumendo un modello normale, è il modo migliore, se non si desidera memorizzare punti di dati di campioni precedenti. Puoi dare un'occhiata a questo documento per un'inferenza congiunta per la media e la varianza, e in particolare le equazioni 38a, 38b e 38c.

Penso che tu possa. Dovrei Google / Wikipidia per questo, quindi lo lascerò come esercizio per il lettore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top