对于大n
(参见下面有关如何确定足够大的数据),通过中心极限定理可以安全地将样本均值的分布视为正常(高斯),但我想要一个为任何n
提供置信区间的过程。这样做的方法是使用具有n-1
自由度的Student T分布。
所以问题是,如果您收集或一次遇到一个数据点流,您如何计算c
(例如,c=.95
)置信区间的平均值。数据点(不存储以前遇到的所有数据)?
另一种问题是:如何在不存储整个流的情况下跟踪数据流的第一和第二时刻?
奖金问题:您是否可以在不存储整个流的情况下跟踪更高的时刻?
答案 0 :(得分:4)
这是一篇关于how to compute the mean and standard deviation in a single pass的文章,没有存储任何数据。获得这两个统计信息后,您可以估算置信区间。假设数据的正态分布和大量数据点,95%置信区间为[均值 - 1.96 * stdev,均值+ 1.96 * stdev]。
对于较少数量的数据点,您的置信区间将为[mean - c(n)* stdev,mean + c(n)* stdev],其中c(n)取决于您的样本大小和置信水平。对于95%的置信水平,这里是你的c(n)的值,n = 2,3,4,...,30
12.70620,4.302653,3.182446,2.776445,2.570582,2.4446912,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
这些数字是g(0.025,n-1),其中g是具有n个自由度的t分布的逆CDF。如果您想要99%的置信区间,请将0.025替换为0.005。通常,对于1-alpha的置信度,使用alpha / 2.
这是生成上述常量的R命令。
n = seq(2, 30); qt(0.025, n-1)
这是一个blog post解释为什么上面的数字并不像你预期的那样接近1.96。
答案 1 :(得分:4)
[非常感谢John D Cook在汇总这个答案时所学到的很多东西!]
首先,这是不使用平方和的原因:http://www.johndcook.com/blog/2008/09/26/
你应该做什么:
跟踪计数(n),平均值(u)和可以确定样本方差和标准误差的数量。 (改编自http://www.johndcook.com/standard_deviation.html。)
初始化n = u = s = 0
。
对于每个新数据点,x
:
u0 = u;
n ++;
u += (x - u) / n;
s += (x - u0) * (x - u);
样本方差为s/(n-1)
,样本均值的方差为s/(n-1)/n
,样本均值的标准误差为SE = sqrt(s/(n-1)/n)
。
仍需计算Student-t c
- 置信区间({0,1)中的c
):
u [plus or minus] SE*g((1-c)/2, n-1)
其中g
是Student-t分布的逆cdf(aka分位数),均值为0且方差为1,取概率和自由度(比数据点数少一个):< / p>
g(p,df) = sign(2*p-1)*sqrt(df)*sqrt(1/irib(1, -abs(2*p-1), df/2, 1/2) - 1)
其中irib
是反正则化的不完全β函数:
irib(s0,s1,a,b) = z such that rib(s0,z,a,b) = s1
其中rib
是正则化的不完全β函数:
rib(x0,x1,a,b) = B(x0,x1,a,b) / B(a,b)
其中B(a,b)
是欧拉beta函数,B(x0,x1,a,b)
是不完整的beta函数:
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
典型的数值/统计库将具有beta函数的实现(或直接为Student-t分布的逆cdf)。对于C,事实上的标准是Gnu科学图书馆(GSL)。通常给出beta函数的3参数版本;对4个参数的推广如下:
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)
最后,这是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}]
与
比较StudentTCI[u, SE, n-1, ConfidenceLevel->c]
或者,当整个数据点列表可用时,
MeanCI[list, ConfidenceLevel->c]
最后,如果您不想为beta函数加载数学库,则可以对-g((1-c)/2, n-1)
的查找表进行硬编码。这是c=.95
和n=2..100
:
12.706204736174698,4.302652729749464,3.182446305283708,2.7764451051977934, 2.570581835636314,2.4449118511449666,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.999971517033376,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.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
渐近接近c=.95
的正常(0,1)分布的逆CDF,即:
-sqrt(2)*InverseErf(-c) = 1.959963984540054235524594430520551527955550...
请参阅http://mathworld.wolfram.com/InverseErf.html了解反erf()
函数。
请注意,g((1-.95)/2,n-1)
在到达至少474个数据点之前不会舍入到1.96。当有29个数据点时,它会变为2.0。
根据经验,你应该使用Student-t代替n
的正常近似值至少300,而不是传统智慧的30。参看http://www.johndcook.com/blog/2008/11/12/
另见康奈尔的Ping Li的“改进压缩计数”。
答案 2 :(得分:2)
sigma = sqrt( (q - (s*s/n)) / (n-1) )
delta = t(1-c/2,n-1) * sigma / sqrt(n)
其中t(x,n-1)是具有n-1个自由度的t-分布。 如果您使用gsl
t = gsl_cdf_tdist_Qinv (c/2.0, n-1)
无需存储超出平方和的任何数据。现在,您可能会遇到数值问题,因为平方和可能非常大。您可以使用s
的备用定义sigma = sqrt(sum(( x_i - s/n )^2 / (n-1)))
并且两次通过。我建议您考虑使用gnu scientific library或像R这样的软件包来帮助您避免数字问题。另外,请注意使用中心极限定理。对于整个金融危机而言,滥用它是部分原因。
答案 3 :(得分:1)
您不想累积平方和。由此产生的统计数据在数值上是不准确的 - 您最终会减去两个相似的大数字。你想要保持方差,或(n-1)*方差,或类似的东西。
直接的方法是逐步累积数据点。公式并不复杂或难以推导(参见John D. Cook的链接)。
更准确的方法是以递归方式成对组合数据点。您可以使用n中的内存对数来执行此操作:寄存器k保存2 ^ k个较旧数据点的统计信息,这些数据点与2 ^ k个较新点的统计信息组合以获取2 ^(k + 1)个点的统计信息...
答案 4 :(得分:1)
我认为您不必过于担心n
的大小,因为它很快会超过30的数量,其中分布可视为正常。假设正态模型,使用贝叶斯递归对总体均值和方差参数进行后验推断,如果您不想存储先前样本中的任何数据点,我认为这是最好的方法。
您可以查看this document关于均值和方差的联合推断,特别是方程38a,38b和38c。
答案 5 :(得分:-7)
我想你可以。我必须使用Google / Wikipidia,所以我会把它作为读者的练习。