如何通过乘以常数(在 R 中)来最小化估计值和实际值之间的误差?

How can I minimize error between estimates and actuals by multiplying by a constant (in R)?

我在 R 中有两个大型数据集,一个是实际测量值,另一个是我对这些测量值所做的预测。我发现我预测的趋势是准确的,但幅度不对。我想知道是否有一种方法可以在 R 中找到一个常量,当预测乘以常量时,最小化实际值和预测值之间的误差。

例如:

predictions <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
actuals <- c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

在这种情况下我想要生成的常量是 2。

我研究过使用 optim() 函数,但得到的警告消息是 "one-dimensional optimization by Nelder-Mead is unreliable: use 'Brent' or optimize() directly."

f <- function(p) cor(p*observed, actual)

optim(
 c(1),
 f,
 control = list(fnscale = -1)
)

我对优化不熟悉,所以我很可能以错误的方式解决了这个问题。感谢您的帮助!

首先让我们定义一个误差函数来最小化:

MultError <- function(constant, predictions, actuals) {

  return(sum((constant*predictions - actuals)^2))

}

这是误差平方和...您可以使用不同的!

optimize() 需要一个函数、一个搜索间隔(您可以通过检查 predictions / actuals 的最小值和最大值来获得)以及任何额外参数。默认会最小化

optimize(MultError, interval=c(0, 5), predictions=predictions, actuals=actuals)

这个returns

$minimum
[1] 2

$objective
[1] 0

分别是最小值和误差函数的值

估计你的匹配不是很完美,所以我也用人工噪声试了一下

set.seed(1)
actuals <- rnorm(length(predictions), 2, 0.4) * predictions

然后returns

$minimum
[1] 2.087324

$objective
[1] 22.21434

不错!

编辑:

由于标题和 OP 的发展方向,我使用优化回答了这个问题,但仔细思考后,它似乎有点矫枉过正。简单地取 mean(actuals / predictions) 有什么问题?

所以我决定对它们都进行测试...

set.seed(1)
arithmetic <- opt <- numeric(10000)

for (trial in 1:10000) {

  actuals <- rnorm(length(predictions), 2, 0.4) * predictions
  arithmetic[trial] <- mean(actuals / predictions)
  opt[trial] <- optimize(MultError, interval=c(0, 5), predictions=predictions, actuals=actuals)$minimum

}

对于 10,000 个可能的数据集,我们使用平均值并通过最小化误差平方和恢复了常量。我们的估计量的均值和方差是多少?

> mean(arithmetic)
[1] 1.999102
> mean(opt)
[1] 1.998695

两者的平均表现都很好。

> var(arithmetic)
[1] 0.0159136
> var(opt)
[1] 0.02724814

但是,算术平均估计量的分布更窄。所以我认为你应该取平均值!

使用线性回归,lm() 函数,您可能会得到一个很好的近似值。

m = lm(actuals ~ predictions)

m 是存储线性回归模型的对象。

coef(m) 将为您提供乘以偏移量的常量。