【问题标题】:Weighted mean of similar elements in a vector in RR中向量中相似元素的加权平均值
【发布时间】:2012-06-11 09:14:01
【问题描述】:

我有两个向量 xww 是一个与x 长度相同的权重数值向量,为x 的元素提供权重。

我想给出向量 x 中它们差异很小的元素的加权平均值(例如 1e-1 或 1e-2),以减少向量 x 的长度。例如,这些向量如下:

    w =c(1.459032e-01, 1.535375e-04, 1.829973e-04, 1.057226e-01, 2.833444e-04,
         2.559756e-04, 6.440060e-03, 6.294748e-02, 5.984383e-04, 2.772186e-04,
         4.869825e-05, 8.212092e-04, 1.233256e-01, 2.558964e-04, 3.990816e-03,
         1.665515e-01, 5.760450e-02, 5.803227e-04, 1.738252e-02, 2.431885e-02,
         1.280266e-03, 1.000000e-03, 1.000117e-03, 2.750921e-03, 3.588227e-03,
         3.489142e-04, 5.117452e-04, 5.117502e-04, 3.262697e-01, 3.060975e-01,
         3.089723e-02, 8.603438e-04, 8.603438e-04, 2.558906e-04, 2.558906e-04,
         7.559512e-04, 1.054060e-03, 8.318323e-04, 8.602753e-04, 8.603439e-04,
         8.269244e-04, 8.602833e-04, 8.979898e-04, 7.745014e-04, 5.117474e-04,
         5.691315e+00, 1.780994e+00, 2.416622e-03, 2.441406e-07, 2.441406e-07,
         3.065381e-05, 2.441406e-07, 2.441328e-07, 2.441324e-07, 2.884505e-07,
         2.441409e-07, 2.441411e-07, 2.441399e-07, 2.441406e-07, 2.441400e-07,
         2.441397e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07,
         2.441406e-07, 2.441406e-07, 2.441404e-07, 2.441406e-07, 1.920616e-03)

     x =c(0.3585121, 0.4399527, 0.5643820, 0.6776966, 0.7542579, 0.8374223, 0.9130900,
          0.9999472, 1.0793771, 1.1249381, 1.1700218, 1.2630534, 1.4131273, 1.4795500,
          1.5388979, 1.6587155, 1.7106946, 1.8248076, 1.9035620, 1.9512584, 2.0362027,
          2.1065388, 2.1525816, 2.2617268, 2.6090246, 2.7180285, 2.7704006, 2.8768953,
          2.9358206, 3.0000000, 3.0655239, 3.1266109, 3.1730078, 3.2681434, 3.3125953,
          3.3620683, 3.4191661, 3.4851182, 3.5373484, 3.5998778, 3.6622245, 3.7306358,
          3.8066598, 3.8726307, 3.9614728, 4.0515907, 4.0998298, 4.1870790, 0.4429813,
          0.5619184, 0.6437753, 0.6856169, 1.1212656, 1.2513217, 1.7290070, 1.9762596,
          2.0103108, 2.0440587, 2.2404542, 2.2742832, 2.5947769, 3.1292874, 3.1730608,
          3.4075734, 3.4651103, 3.5266852, 3.5886457, 3.7197153, 3.7967120, 4.0553866)

我知道如何根据权重对向量 x 进行排序,但是如何识别向量 x 中的相似值,然后得到它们的加权平均值?

【问题讨论】:

  • 考虑到 e-01 和 e-02 的值不小,您的要求并不是很清楚; e-07 值很小。但是:如果您只想要加权平均并 x 和 w,然后 mean() 结果。
  • 我的解释是,目的是找到“向量 x 中的相似值”......如果将这些值组合在一起,那么这将减少向量 x 的长度。直观地说,这可能意味着权重为 w1 和 w2 的两个相似元素 x1 和 x2 被权重为 w1+w2 的折衷值 x 替换,这样总加权平均值保持不变...
  • @TimP:感谢您的评论,当我们有两个相似的值时,您的解释是正确的,但实际上可能是我有两个以上的相似值(例如 3 或 4,...相似0.4 和 3 的值,4 相似的值 1.7)。我想找到这些相似的值并获得该组的加权平均值并具有权重 w1+ w2+ w3+...您编写的代码找到了两个相似的值。当它有两个以上相似的值时我该怎么办?
  • 快速澄清:所以你想选择一个像 0.01 这样的值来表示两个元素“接近”,然后如果 x 包含一个像 (1.800, 2.000, 2.008, 2.016, 2.200) 这样的序列,你' d 将元素 2、3 和 4 组合在一起,因为相邻距离(2.000 到 2.008 和 2.008 到 2.016)都小于 0.01?即使元素 2 和 4 总体上相隔超过 0.01?
  • @TimP:是的。这正是我正在寻找的。如上所示,我写了一个函数,但我不知道为什么循环不停止?

标签: r weighted-average


【解决方案1】:

更新答案

这样的事情怎么样...? (见下面的代码)

我将您的原始向量称为 origx 和 origw,因此重新排序的向量是 x 和 w。该代码适用于被销毁的 x 和 w(称为 xtemp 和 wtemp)的临时副本,并在变量 xnew 和 wnew 中构建新的 x 和 w(即您寻找的“较短”向量)。

简单来说,代码查看 xtemp 并找到第一个超过阈值大小(例如 0.05)的间隙,并将从 xtemp 开始运行到那个“大”间隙的所有元素组合在一起。 (如果没有这样的差距,则将整个 xtemp 视为一个组。)然后该代码将该组转换为称为 wgroup 的单个权重(组权重的总和)和称为 xgroup 的单个代表性 x 值(例如 xgroup* wgroup 与所有组元素的加权和相同)。然后我们将 xgroup 和 wgroup 保存到向量 xnew 和 wnew 中,清除当前组(通过从 xtemp 和 wtemp 中消除它),然后以相同的方式继续操作,直到所有内容都被分组。

给它一个测试运行,看看你的想法:)

origw = c(1.459032e-01, 1.535375e-04, 1.829973e-04, 1.057226e-01, 2.833444e-04,
          2.559756e-04, 6.440060e-03, 6.294748e-02, 5.984383e-04, 2.772186e-04,
          4.869825e-05, 8.212092e-04, 1.233256e-01, 2.558964e-04, 3.990816e-03,
          1.665515e-01, 5.760450e-02, 5.803227e-04, 1.738252e-02, 2.431885e-02,
          1.280266e-03, 1.000000e-03, 1.000117e-03, 2.750921e-03, 3.588227e-03,
          3.489142e-04, 5.117452e-04, 5.117502e-04, 3.262697e-01, 3.060975e-01,
          3.089723e-02, 8.603438e-04, 8.603438e-04, 2.558906e-04, 2.558906e-04,
          7.559512e-04, 1.054060e-03, 8.318323e-04, 8.602753e-04, 8.603439e-04,
          8.269244e-04, 8.602833e-04, 8.979898e-04, 7.745014e-04, 5.117474e-04,
          5.691315e+00, 1.780994e+00, 2.416622e-03, 2.441406e-07, 2.441406e-07,
          3.065381e-05, 2.441406e-07, 2.441328e-07, 2.441324e-07, 2.884505e-07,
          2.441409e-07, 2.441411e-07, 2.441399e-07, 2.441406e-07, 2.441400e-07,
          2.441397e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07, 2.441406e-07,
          2.441406e-07, 2.441406e-07, 2.441404e-07, 2.441406e-07, 1.920616e-03)

origx = c(0.3585121, 0.4399527, 0.5643820, 0.6776966, 0.7542579, 0.8374223, 0.9130900,
          0.9999472, 1.0793771, 1.1249381, 1.1700218, 1.2630534, 1.4131273, 1.4795500,
          1.5388979, 1.6587155, 1.7106946, 1.8248076, 1.9035620, 1.9512584, 2.0362027,
          2.1065388, 2.1525816, 2.2617268, 2.6090246, 2.7180285, 2.7704006, 2.8768953,
          2.9358206, 3.0000000, 3.0655239, 3.1266109, 3.1730078, 3.2681434, 3.3125953,
          3.3620683, 3.4191661, 3.4851182, 3.5373484, 3.5998778, 3.6622245, 3.7306358,
          3.8066598, 3.8726307, 3.9614728, 4.0515907, 4.0998298, 4.1870790, 0.4429813,
          0.5619184, 0.6437753, 0.6856169, 1.1212656, 1.2513217, 1.7290070, 1.9762596,
          2.0103108, 2.0440587, 2.2404542, 2.2742832, 2.5947769, 3.1292874, 3.1730608,
          3.4075734, 3.4651103, 3.5266852, 3.5886457, 3.7197153, 3.7967120, 4.0553866)

reord = order(origx)
x = origx[reord]
w = origw[reord]

xnew = wnew = c()

thresh = 0.05
xtemp = x
wtemp = w
while (length(xtemp) > 0) {
nextgap = which(diff(xtemp) > thresh)[1]
if (!is.na(nextgap)) {
    group = seq_len(nextgap)
} else {
    group = seq_along(xtemp)
}
xgroup = sum((xtemp*wtemp)[group])/sum(wtemp[group])
wgroup = sum(wtemp[group])
xnew = c(xnew, xgroup)
wnew = c(wnew, wgroup)
xtemp = xtemp[-group]
wtemp = wtemp[-group]
}

OLD RESPONSE IS BELOW(已被上述内容取代...)

我建议重新排序 x 和 w,使 x 严格按照数字顺序排列,然后使用 diff 函数:

reord = order(x)
x2 = x[reord]
w2 = w[reord]
which(diff(x2)<0.01)

上面的最后一条命令指示x2x 的排序版本)中的哪些元素与次高元素的距离在 0.01 以内。第一个值为 2,因为 x2 的元素 2 和 3 就是这样的示例:x2[2]=0.4399527x2[3]=0.4429813

如果你这样做了

sort(diff(x2))

您可以查看按数字顺序排列的所有差异,这可能有助于您确定合适的截止值。

【讨论】:

  • 非常感谢。这是我的目标。
  • 没问题,试运行,如果一切正常,请告诉我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多