【问题标题】:How to compute weighted means of a vector within factor levels?如何计算因子水平内向量的加权平均值?
【发布时间】:2011-02-01 18:29:00
【问题描述】:

我能够成功地在因子水平内获得给定向量的简单平均值,但是在尝试将其用于加权观察的下一步时,我无法让它发挥作用。这有效:

> tapply(exp.f,part.f.p.d,mean)
    1         2         3         4         5         6         7        8             9        10 
0.8535996 1.1256058 0.6968142 1.4346451 0.8136110 1.2006801 1.6112160 1.9168835     1.5135006 3.0312460 

但这不是:

> tapply(exp.f,part.f.p.d,weighted.mean,b.pct)
Error in weighted.mean.default(X[[1L]], ...) : 
  'x' and 'w' must have the same length
> 

在下面的代码中,我试图在因子 part.f.p.d 的级别内找到 exp.f 的加权平均值,由每个级别中 b.pct 内的观察加权。

b.exp <- tapply(exp.f,part.f.p.d,weighted.mean,b.pct)

Error in weighted.mean.default(X[[1L]], ...) : 
  'x' and 'w' must have the same length

我认为我必须提供不正确的语法,因为所有 3 个向量的长度都相同:

> length(b.pct)
[1] 978
> length(exp.f)
[1] 978
> length(part.f.p.d)
[1] 978

这样做的正确方法是什么?提前谢谢你。

【问题讨论】:

  • 您好 jonw- exp.f 是股票预期收益的数值向量,part.f.p.d 是一个有 10 个级别的因子,b.pct 是指数中每只股票的百分比(前 1000 只股票) )

标签: r


【解决方案1】:

现在我这样做了(感谢 Gavin):

sapply(split(Data,Data$part.f.p.d), function(x) weighted.mean(x$exp.f,x$b.pct)))

其他人可能使用 plyr 包中的 ddply

ddply(Data, "part.f.p.d", function(x) weighted.mean(x$exp.f, x$b.pct))

【讨论】:

  • @Prasad:我知道强制 plyr 解决方案会获得一些支持。 ;-)
  • 谢谢 - 我知道我需要花一些时间来了解 plyr 的全部内容。干杯。
  • @Joshua do.call 在这里有点多余。 sapply(split(Data, Data$part.f.p.d), function(x) weighted.mean(x$exp.f,x$b.pct)) 足以返回加权均值向量。 split 方法 (+1) 的简单性被 rbind+do.call 包装所隐藏。
  • 为什么喜欢 plyr? ;-) 我同意这是一个非常好的包,但是像 Q 中提出的这些简单问题可以通过基本的 R 功能很好地处理,而无需学习新的包。
  • @Gavin:do.call(rbind, ...) 只是习惯于解决更普遍的问题。你说得对,sapply 在这种情况下要好得多。
【解决方案2】:

您的问题是tapply 不会像对主要参数X 那样“拆分”提供给函数的额外参数(通过其... 参数)。请参阅tapply (?tapply) 帮助页面上的“注释”。

FUN 提供的可选参数 ... 论点不分为 细胞。因此不合适 有趣的是期待额外的论点 长度与 X 相同。

这是一个 hacky 解决方案。

exp.f <- rnorm(10)
part.f.p.d <- factor(sample(1:5, size = 10, replace = T))
b.pct <- rnorm(10)
a <- split(exp.f, part.f.p.d)
b <- split(b.pct, part.f.p.d)
lapply(seq_along(a), function(i){
  weighted.mean(a[[i]], b[[i]])
})

【讨论】:

    【解决方案3】:

    我用一些虚拟数据重新创建了错误。我假设part.f.p.d 是您用来分隔其他向量的某种因素。

    b.pct <- sample(1:100, 10) / 100
    exp.f <- sample(1:1000, 10)
    part.f.p.d <- factor(rep(letters[1:5], 2))
    
    tapply(exp.f, part.f.p.d, mean) # this works
    tapply(exp.f, part.f.p.d, weighted.mean, w = b.pct) # this doesn't
    

    致电traceback() 有助于发现问题。第二个不起作用的原因是因为您传递给tapply()INDEX 参数(即part.f.p.d)用于将X 参数(即exp.f)拆分为更小的向量。这些拆分中的每一个都与未拆分的w 参数(即b.pct)一起应用于weighted.mean()

    编辑:这应该做你想要的。

    sapply(levels(part.f.p.d), 
           function(whichpart) weighted.mean(x = exp.f[part.f.p.d == whichpart], 
                                             w = b.pct[part.f.p.d == whichpart]))
    

    【讨论】:

    • 谢谢 - 是否有一些调整可以使这项工作来计算您知道的加权平均值?
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2017-01-06
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多