如何通过乘以常数(在 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)
将为您提供乘以偏移量的常量。
我在 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)
将为您提供乘以偏移量的常量。