R:你如何用代数方法撤消加权平均值?

时间:2017-04-08 18:00:53

标签: r math statistics

假设我有以下数值:

ue <- c(0.1784545, 0.2248318, 0.2561000, 0.2722773, 0.2629545, 0.2797364 0.2294227)
ff <- c(679, 631, 588, 514, 380, 192 , 60)
r <-  c(0.6167, 0.8099, 0.9902, 1.0767, 1.1359, 1.2550, 1.6187)

我想解决以下代数方程:

weighted.mean((1-(ue+x)*r), ff) = .58498  

我要为x解决的问题。换句话说,为了使加权平均值减去ue*rff的乘积等于.58498,我需要增加多少才能增加ue。

我可以通过for循环来近似这个答案,但我无法弄清楚如何以代数方式进行此操作。

2 个答案:

答案 0 :(得分:4)

这将完成这项工作:

> ue <- c(0.1784545, 0.2248318, 0.2561000, 0.2722773, 0.2629545, 0.2797364, 0.2294227)
> ff <- c(679, 631, 588, 514, 380, 192 , 60)
> r <-  c(0.6167, 0.8099, 0.9902, 1.0767, 1.1359, 1.2550, 1.6187)
> f <- function(x)  (weighted.mean((1-(ue+x)*r), ff) - .58498)
> uniroot(f, lower=-100000000, upper=100000000)$root
[1] 0.2012965

请确保以适当的方式指定lowerupper(根据您对问题的了解),以确保根位于区间内。

如果不这样做会给你一个错误:

> uniroot(f, lower=50, upper=100000000)$root
Error in uniroot(f, lower = 50, upper = 1e+08) : 
  f() values at end points not of opposite sign

答案 1 :(得分:4)

如果您只是编写等式并进行数学计算,那么找到x的以下表达式并不难:

((1-.58498) * sum(ff) - sum(ff*r*ue)) / sum(ff*r)
# [1] 0.2012965

以下是使用R样式编写的计算的主要步骤。 (它们不是要执行的代码行,而只是一个快速解释。)

weighted.mean((1-(ue+x)*r), ff) == .58498

sum(ff * (1 - (ue+x)*r)) == .58498 * sum(ff)

sum(ff) - sum(ff*(ue+x)*r) == .58498 * sum(ff)

sum(ff*(ue+x)*r) == (1-.58498) * sum(ff)

sum(ff*ue*r) + x*sum(ff*r) == (1-.58498) * sum(ff)

因此结果:x == ((1-.58498) * sum(ff) - sum(ff*r*ue)) / sum(ff*r)