簡體   English   中英

如何通過乘以常數(以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()函數,但收到警告消息,“通過Nelder-Mead進行的一維優化不可靠:直接使用'Brent'或optimize()。”

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 / actuals的最小值和最大值來獲得間隔)以及任何其他參數。 默認情況下它將最小化

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

這返回

$minimum
[1] 2

$objective
[1] 0

分別是最小值的值和誤差函數的值。

想必您的配對並不完美,所以我也嘗試了人工噪音

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

然后返回

$minimum
[1] 2.087324

$objective
[1] 22.21434

非常好!

編輯:

由於標題和OP的發展方向,我使用了optimize來回答了這個問題,但經過認真思考,這似乎可能會導致過大殺傷力。 簡單地取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)將給您常數乘以一個偏移量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM