计算平均置信区间而不存储所有数据点

dre*_*ves 6 language-agnostic math statistics montecarlo

对于大的n(见下面有关如何确定足够大),通过中心极限定理处理样本均值的分布是正常的(高斯分布)是安全的,但我想要一个给出任何置信区间的程序.n.这样做的方法是使用具有n-1自由度的Student T分布.

所以问题是,如果您收集或一次遇到一个数据点流,您如何计算c(例如c=.95)数据点平均值的置信区间(不存储以前遇到的所有数据)?

另一种问题是:如何在不存储整个流的情况下跟踪数据流的第一和第二时刻?

奖金问题:您是否可以在不存储整个流的情况下跟踪更高的时刻?

Joh*_*ook 5

这是一篇关于如何在单次传递中计算均值和标准差的文章,而不是存储任何数据。一旦你有了这两个统计数据,你就可以估计一个置信区间。[mean - 1.96*stdev, mean + 1.96*stdev]假设您的数据和大量数据点呈正态分布,则95% 的置信区间为 。

对于数据点的数量较少,你置信区间将是[mean - c(n)*stdev, mean + c(n)*stdev]哪里c(n)取决于你的样本大小和你的信心水平。对于 95% 的置信度,以下是您的值c(n)for 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

这些数字是g(0.025, n-1)其中g是t分布n自由度的的逆CDF。如果您想要 99% 的置信区间,请将 0.025 替换为 0.005。通常,对于 的置信水平1-alpha,请使用alpha/2

这是生成上述常量的R命令。

n = seq(2, 30); qt(0.025, n-1)
Run Code Online (Sandbox Code Playgroud)

这是一篇博客文章,解释了为什么上述数字不像您预期​​的那样接近 1.96。


dre*_*ves 4

[非常感谢 John D Cook 在整理这个答案时学到的很多东西!]

首先,这是不使用平方和的原因: http://www.johndcook.com/blog/2008/09/26/

你应该做什么:

跟踪计数 (n)、平均值 (u) 和数量 (s),从中可以确定样本方差和标准误差。(改编自http://www.johndcook.com/standard_deviation.html。)

初始化n = u = s = 0.

对于每个新数据点x

u0 = u;
n ++;
u += (x - u) / n;
s += (x - u0) * (x - u);
Run Code Online (Sandbox Code Playgroud)

则样本方差为s/(n-1),样本均值的方差为s/(n-1)/n,样本均值的标准误为SE = sqrt(s/(n-1)/n)

剩下的就是计算 Student-tc置信区间(c在 (0,1) 中):

u [plus or minus] SE*g((1-c)/2, n-1)
Run Code Online (Sandbox Code Playgroud)

其中g是均值为 0、方差为 1 的 Student-t 分布的逆 cdf(也称为分位数),采用概率和自由度(比数据点数量少一):

g(p,df) = sign(2*p-1)*sqrt(df)*sqrt(1/irib(1, -abs(2*p-1), df/2, 1/2) - 1)
Run Code Online (Sandbox Code Playgroud)

其中irib是逆正则化不完全 beta 函数:

irib(s0,s1,a,b) = z such that rib(s0,z,a,b) = s1
Run Code Online (Sandbox Code Playgroud)

其中rib是正则化不完全 beta 函数:

rib(x0,x1,a,b) = B(x0,x1,a,b) / B(a,b)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

典型的数值/统计库将具有 beta 函数(或直接 Student-t 分布的逆 cdf)的实现。对于 C 语言来说,事实上的标准是 Gnu Scientific Library (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)
Run Code Online (Sandbox Code Playgroud)

最后,这是 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}]
Run Code Online (Sandbox Code Playgroud)

相比于

StudentTCI[u, SE, n-1, ConfidenceLevel->c]
Run Code Online (Sandbox Code Playgroud)

或者,当整个数据点列表可用时,

MeanCI[list, ConfidenceLevel->c]
Run Code Online (Sandbox Code Playgroud)

最后,如果您不想加载 beta 函数之类的数学库,您可以硬编码-g((1-c)/2, n-1). 这是c=.95n=2..100

12.706204736174698、4.302652729749464、3.182446305283708、2.7764451051977934、2.570581835636314、2.4469118511449666、2.3646 242515927853、2.306004135204168、2.262157162798205、2.2281388519862735、2.2009851600916384、2.178812829667226、2.160368656462 7917, 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.0369333 434600976、2.0345152974493392、2.032244509317719、2.030107928250338、2.0280940009804462、2.0261924630291066、2.02439416391196 6、2.022690920036762、2.0210753903062715、2.0195409704413745、2.018081702818439、2.016692199227822、2.0153675744437627、2.014 1033888808457、 2.0128955989194246、 2.011740513729764、 2.0106347576242314、 2.0095752371292335、 2.0085591121007527、 2.007583770315835、2.0066468050616857、2.005745995317864、2.0048792881880577、2.004044783289136、2.0032407188478696、2.0024 65459291016、2.001717484145232、2.000995378088259、2.0002978220142578、1.9996235849949402、1.998971517033376、1.9983405425207 483, 1.997729654317692, 1.9971379083920013, 1.9965644189523084, 1.996008354025304, 1.9954689314298386, 1.994945415107228, 1.9 944371117711894、1.9939433678456229、1.993463566661884、1.9929971258898527、1.9925434951809258、1.992102154002232、 1.9916726096446793、 1.9912543953883763、 1.9908470688116922、 1.9904502102301198、 1.990063421254452、 1.989686323456895、 1.989 3185571365664、1.9889597801751728、1.9886096669757192、1.9882679074772156、1.9879342062390228、1.9876082815890748、1.98728986 48311672, 1.9869786995062702, 1.986674540703777, 1.986377154418625, 1.9860863169510985, 1.9858018143458114, 1.985523441866606 1、 1.9852510035054973、 1.9849843115224508、 1.9847231860139618、 1.98446745450849、 1.9842169515863888

渐近逼近 的正态 (0,1) 分布的逆 CDF c=.95,即:

-sqrt(2)*InverseErf(-c) = 1.959963984540054235524594430520551527955550...
Run Code Online (Sandbox Code Playgroud)

有关反函数,请参见http://mathworld.wolfram.com/InverseErf.htmlerf()。请注意,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 的“改进压缩计数”。