2008-11-12 3 views
6

Für große n (siehe unten, um zu bestimmen, was groß genug ist), ist es mit dem zentralen Grenzwertsatz sicher, die Verteilung des Stichprobenmittelwerts als normal zu behandeln (Gaussian) aber ich möchte eine Prozedur, die ein Vertrauensintervall für alle n gibt. Die Methode hierfür ist die Verwendung einer Student T-Verteilung mit n-1 Freiheitsgraden. Die Frage ist also, ob man bei einem Strom von Datenpunkten, die man sammelt oder nacheinander antrifft, ein c (z. B. c=.95) Konfidenzintervall auf den Mittelwert der Datenpunkte berechnet (ohne alle Daten zu speichern) die zuvor angetroffenen Daten)?Berechnen eines mittleren Konfidenzintervalls ohne Speichern aller Datenpunkte

Eine andere Möglichkeit, dies zu fragen, ist: Wie behalten Sie den ersten und zweiten Moment für einen Datenstrom bei, ohne den gesamten Stream zu speichern?

BONUS FRAGE: Können Sie höhere Momente verfolgen, ohne den gesamten Stream zu speichern?

+0

PS: Ich glaube mit ziemlich hohem Vertrauen, dass meine Antwort unten vollständig und richtig ist. Vielen Dank an John D Cooke und David Nehme! – dreeves

+0

An John D Cook: Entschuldigung, ich bin mir nicht sicher, wo ich auf die Idee gekommen bin, das extra E auf deinen Namen zu setzen! – dreeves

+0

> "Der Weg dahin ist, eine Student T-Distribution mit n-1 Freiheitsgraden zu verwenden." --- basierend worauf? Die Ableitung der T-Verteilung beruht auf * drei * Dingen - dass der Zähler normal ist (ich gebe das unter bestimmten Bedingungen zu), dass der Nenner ein entsprechend skaliertes Chi ist und dass Zähler und Nenner unabhängig sind. Hast du alle drei? –

Antwort

3

[! Vielen dank an John D Koch für viel von dem, was ich bei der zusammen~~POS=TRUNC dieser Antwort gelernt]

Zuerst, hier ist der Grund nicht Summe der Quadrate zu verwenden: http://www.johndcook.com/blog/2008/09/26/

Was Sie stattdessen tun sollte:

verfolgen der Zählung (n), die mittleren (u) und eine Menge (n), aus der Stichprobenvarianz und den Standardfehler kann bestimmt. (Angepasst von http://www.johndcook.com/standard_deviation.html.)

Initialize n = u = s = 0.

Für jeden neuen Datenpunkt, x:

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

Die Probe wird dann Varianz s/(n-1), die Varianz des Stichprobenmittelwertes ist s/(n-1)/n, und der Standardfehler der Probe bedeutet SE = sqrt(s/(n-1)/n) ist.

Es bleibt den Student-t-c -Konfidenzintervall (c in (0,1)) zu berechnen:

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

wo g ist die inverse cdf (aka Quantil) der Student-t-Verteilung mit Mittelwert 0 und Varianz 1, mit einer Wahrscheinlichkeit und die Freiheitsgrade nehmen (eins weniger als die Anzahl von Datenpunkten):

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

wo irib ist die inverse unvollständige Betafunktion regula:

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

wo rib ist die regularisierten unvollständige Beta-Funktion:

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

wo B(a,b) die Beta-Funktion Euler und B(x0,x1,a,b) ist die unvollständige Beta-Funktion:

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 

Typische Zahlen/Statistik-Bibliotheken wird Implementierungen der Beta-Funktion haben (oder das inverse cdf der Student-t-Distribution direkt). Für C ist der De-facto-Standard die Gnu Scientific Library (GSL).Oft wird eine 3-Argumente-Version der Beta-Funktion gegeben; die Verallgemeinerung auf 4 Argumente lautet wie folgt:

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) 

Schließlich hier ist eine Implementierung 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}] 

zu

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

oder, wenn die gesamte Liste der Datenpunkte ist verfügbar,

MeanCI[list, ConfidenceLevel->c] 

Schließlich, wenn Sie keine Mathe-Bibliotheken für Dinge wie die Beta-Funktion laden wollen, können Sie eine Nachschlagetabelle für -g((1-c)/2, n-1) fest codieren. Hier ist es für c=.95 und 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,0422 724563, 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,9965644189523 084, 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,9882679074772156, 1,9879342062390228, 1,9876082815890748, 1,9872898648311672 , 1,9869786995062702, 1,986674540703777, 1,986377154418625, 1,9860863169510985, 1,9858018143458114, 1,9855234418666061, 1,9852510035054973, 1,9849843115224508, 1,9847231860139618, 1,98446745450849, 1,9842169515863888

die asymptotisch die Inverse CDF einer normalen (0,1) für die Verteilung c=.95 nähert, welche ist:

-sqrt(2)*InverseErf(-c) = 1.959963984540054235524594430520551527955550... 

Siehe http://mathworld.wolfram.com/InverseErf.html für die inverse Funktion erf(). Beachten Sie, dass sich g((1-.95)/2,n-1) nicht auf 1,96 aufrunden, bis mindestens 474 Datenpunkte vorliegen. Bei 29 Datenpunkten wird auf 2,0 gerundet.

Als Faustregel sollten Sie Student-t anstelle der normalen Approximation für n bis zu mindestens 300 verwenden, nicht 30 pro herkömmlicher Weisheit. Vgl. http://www.johndcook.com/blog/2008/11/12/.

Siehe auch "Verbessertes komprimiertes Zählen" von Ping Li von Cornell.

-7

Ich denke du kannst. Ich würde Google/Wikipidia dafür brauchen, also überlasse ich das als Übung für den Leser.

4

Hier ist ein Artikel auf how to compute the mean and standard deviation in a single pass, speichert keine Daten. Sobald Sie diese beiden Statistiken haben, können Sie ein Konfidenzintervall schätzen. Ein 95% -Konfidenzintervall wäre [Mittelwert - 1,96 * stdev, Mittelwert + 1,96 * stdev], unter der Annahme einer Normalverteilung für Ihre Daten und einer großen Anzahl von Datenpunkten.

Für eine kleinere Anzahl von Datenpunkten, Ihr Konfidenzintervall wäre [mean - c (n) * stdev bedeuten + c (n) * stdev], wobei c (n) auf der Stichprobengröße hängt und Ihr Konfidenzniveau . Für ein Konfidenzniveau von 95% sind hier Ihre Werte von c (n) für 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.093024, 2.085963, 2.079614, 2.073873, 2.068658, 2.063899, 2.059539, 2.055529, 2.051831, 2.048407, 2.045230

Diese Zahlen sind g (0,025, n-1), wobei g die inverse CDF der t-Verteilung mit n Freiheitsgraden ist. Wenn Sie ein Konfidenzintervall von 99% wünschen, ersetzen Sie 0,025 durch 0,005. Im Allgemeinen verwenden Sie für ein Konfidenzniveau von 1-Alpha Alpha/2.

Hier ist der R Befehl, der die obigen Konstanten generiert hat.

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

Hier ist ein blog post zu erklären, warum die oben genannten Zahlen sind nicht so nahe an 1,96 wie man erwarten könnte.

+0

Beachten Sie, dass ich keine normale Verteilung annehmen möchte. Das ist ein ausgezeichneter Artikel, aber ich denke, dass er nur für den großen n-Fall gilt. – dreeves

+0

Ich schätze gerade die Brillanz der Technik in diesem Artikel, und es ist * relevant hier, nur dass es einen weiteren Schritt benötigt, nämlich die Anwendung der t-Verteilung, wie David Nehme angibt. Vielleicht ist es am besten, die Frage zu aktualisieren ... – dreeves

+0

Ich habe Notizen hinzugefügt, wie man die t-Verteilung für kleine Samples einbaut. Dies wird Ihnen eine allgemeine Lösung für alle n geben. –

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

Dabei ist t (x, n-1) die t-Verteilung mit n-1 Freiheitsgraden. , wenn Sie mit gsl

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

Es gibt keine Notwendigkeit, alle Daten über die Summe der Quadrate zu speichern. Jetzt haben Sie vielleicht ein numerisches Problem, weil die Summe der Quadrate ziemlich groß sein kann. Sie könnten die alternative Definition von s

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

verwenden und zwei Durchgänge machen. Ich würde Sie ermutigen, die Verwendung von gnu scientific library oder ein Paket wie R in Betracht zu ziehen, um numerische Probleme zu vermeiden. Seien Sie vorsichtig bei der Verwendung des zentralen Grenzwertsatzes.Der Missbrauch ist teilweise für die gesamte Finanzkrise verantwortlich, die gerade stattfindet.

+0

PS: John D Cooke bietet einen besseren Weg, Sigma (die Stichprobenabweichung) zu verfolgen. Also denke ich, dass der richtige Weg, dies für die Nachwelt zu strukturieren, darin besteht, meine Summe der Quadrate von der Frage zu entfernen und Ihre und Johns Antworten zu kombinieren. – dreeves

+0

Fertig. Außerdem denke ich, dass du das inverse cdf willst, oder? Ich habe meine Antwort in Bezug auf die Euler-Beta-Funktion geschrieben. – dreeves

+0

Meinst du t ((1-c)/2, n-1)? Und dann t (p, df) = gsl_cdf_tdist_Qinv (p, df)? – dreeves

1

Sie wollen nicht die Summe der Quadrate akkumulieren. Die resultierenden Statistiken sind numerisch ungenau - Sie werden zwei große, ähnliche Zahlen subtrahieren. Sie möchten die Varianz oder (n-1) * Varianz oder etwas ähnliches beibehalten.

Der einfachste Weg ist es, die Datenpunkte inkrementell zu akkumulieren. Die Formel ist nicht kompliziert oder schwer abzuleiten (siehe Link von John D. Cook).

Eine noch genauere Art und Weise, es zu tun ist, um die Datenpunkte paarweise rekursiv zu kombinieren. Sie können dies in n mit Speicher logarithmisch: Registrieren k Statistiken für 2^k ältere Datenpunkte enthält, die mit Statistiken für 2^k neue Punkte kombiniert werden Statistiken für 2^(k + 1) Punkte zu bekommen ...

+0

Ich verstehe deinen "noch genaueren Weg" nicht. Ihr habt mich definitiv überzeugt, die Summe der Quadrate nicht zu speichern. Ich werde die Frage aktualisieren. Wenn Sie mehr über die "paarweise-rekursive" Technik sagen können, bin ich ganz Ohr. – dreeves

+0

Das Hinzufügen kleiner Zahlen zu einem großen Akkumulatorwert verliert an Genauigkeit, was wichtig sein kann, z. B. wenn n groß ist und Genauigkeitsanforderungen stark sind. Wenn Sie sich Sorgen über kleine-n-Konfidenzintervalle machen, sollte ein regulärer Akkumulator in Ordnung sein - der große Schritt ist weg von der Summe der Quadrate. – comingstorm

1

Ich denke, dass Sie nicht so viel über die Größe von n kümmern müssen, weil es bald die Zahl von 30 überschreiten wird, wo die Verteilung als normal angesehen werden kann. Die Verwendung der Bayesschen Rekursion, um eine Rückschlussfolgerung auf die Populationsmittelwerte und Varianzparameter zu treffen, unter Annahme eines normalen Modells, halte ich für den besten Weg, wenn Sie keine Datenpunkte aus vorherigen Stichproben speichern wollen. Sie können einen Blick auf this document für Joint Inference für den Mittelwert und die Varianz, und speziell Gleichungen 38a, 38b und 38c.

+0

Danke! Wie für den Schwellenwert n = 30, siehe den vorletzten Absatz in meiner Antwort (den, den ich unhöflich als akzeptiert markiert habe). – dreeves

Verwandte Themen