[英]How can I get parameter estimates such as the mean of the parameter estimates of k subgroups of a dataset over 100 trials in 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.