想象一下,我收集了一组数据,比方说,一个路段的旅行时间。在这个集合上,我想计算平均值和标准差。到目前为止没什么难的。
现在想象一下,我没有为一个路段收集值,而是有多个值集合,这些值对应于组成路段的多个子段。
对于每个集合,我知道平均值和标准差。由此,我想把这些多重平均偏差和标准差相加,从而得到整个路段的平均偏差和标准差。
例如,假设我有以下数据集:
subSegmentA , subSegmentB , subSegmentC , subSegmentD
values 20 45 25 70
30 55 10 60
10 10 10 80
15 50 30 75
15 40 15 75
20 40 20 80
30 45 20 65
10 40 25 70
average 18.75 40.625 19.375 71.875
stddev 7.90569415 13.47948176 7.288689869 7.039429766
expected_global_average : 150.625
expected_global_stddev : 18.40758772对于平均来说没有问题,一个简单的和做的工作,但我有麻烦的global_stddev。
我尝试了这里的多种解决方案,但都没有成功。
编辑:经过进一步的研究,似乎不可能仅仅根据子集的标准差和平均值来计算集合的标准差。
因此,我试图计算一个新的度量,它将近似于这个全球标准差。
要做到这一点,除了每个子段的avg/stddev之外,我还可以使用子段与道路的长度比。
发布于 2018-07-24 23:43:56
它并不完美,但您可以尝试重新创建基于平均值和sd的合成数据。在R中,可以使用rnorm函数从mean和sd创建正态分布。以下是其中一种方法。希望能帮上忙!我选择n= 1000来说明它是如何实现的,你可以尝试使用不同的数字。
a <- c(20,30,10,15,15,20,30,10)
b <- c(45,55,10,50,40,40,45,40)
c <- c(25,10,10,30,15,20,20,25)
d <- c(70,60,80,75,80,60,65,70)
n <- 1000
e <- c(rnorm(n, mean(a), sd(a)) +
rnorm(n, mean(b), sd(b)) +
rnorm(n, mean(c), sd(c)) +
rnorm(n, mean(d), sd(d)))
mean(e)
sd(e)发布于 2022-11-20 07:48:55
您可以使用Chan等人的“批处理扩展”。将方差(标准差平方)和数据子集均值结合起来的Welford算法。该算法在数值上具有鲁棒性和精确性。
见https://en.wikipedia.org/wiki/Algorithms_为_计算_variance#Parallel_算法。
我在这里用Python实现了它:https://github.com/himbeles/pairwise-statistics
对于您的例子,用法和结果将是
# biased or unbiased estimator
ddof=0
# combine statistics of array a, b, c, d
array_a = np.array([20,30,10,15,15,20,30,10])
array_b = np.array([45,55,10,50,40,40,45,40])
array_c = np.array([25,10,10,30,15,20,20,25])
array_d = np.array([70,60,80,75,75,80,65,70])
n_a = len(array_a)
n_b = len(array_b)
n_c = len(array_c)
n_d = len(array_d)
mean_a = np.mean(array_a)
mean_b = np.mean(array_b)
mean_c = np.mean(array_c)
mean_d = np.mean(array_d)
var_a = np.var(array_a, ddof=ddof)
var_b = np.var(array_b, ddof=ddof)
var_c = np.var(array_c, ddof=ddof)
var_d = np.var(array_d, ddof=ddof)
sa = StatisticsAggregator(ddof=ddof)
sa.add(n_a, mean_a, var_a)
sa.add(n_b, mean_b, var_b)
sa.add(n_c, mean_c, var_c)
sa.add(n_d, mean_d, var_d)
print('global mean', sa.mean)
print('global std. dev.', np.sqrt(sa.var))
#>> global mean 37.65625
#>> global std. dev. 23.317924134397128
# result should be variance and mean of concatenated, total array
array_e = np.hstack([array_a, array_b, array_c, array_d])
n_e = len(array_e)
mean_e = np.mean(array_e)
var_e = np.var(array_e, ddof=ddof)
assert np.isclose(sa.mean, mean_e)
assert np.isclose(sa.var, var_e) https://datascience.stackexchange.com/questions/35953
复制相似问题