代码之家  ›  专栏  ›  技术社区  ›  elliottlee

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

  •  0
  • elliottlee  · 技术社区  · 7 年前

    例如:

    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()函数,但得到了一条警告消息:“内尔德·米德的一维优化不可靠:直接使用‘Brent’或optimize()

    f <- function(p) cor(p*observed, actual)
    
    optim(
     c(1),
     f,
     control = list(fnscale = -1)
    )
    

    2 回复  |  直到 7 年前
        1
  •  1
  •   HarlandMason    7 年前

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

    MultError <- function(constant, predictions, actuals) {
    
      return(sum((constant*predictions - actuals)^2))
    
    }
    

    optimize() 需要一个函数,一个要搜索的间隔(可以通过检查 predictions / 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
    

    不错!

    编辑:

    我用optimize回答这个问题是因为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
    
    }
    

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

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

    然而,算术平均估计具有更紧密的扩展。所以我认为你应该取平均值!

        2
  •  0
  •   rdodhia    7 年前

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

    m = lm(actuals ~ predictions)

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

    coef(m) 将给你一个常数,乘以一个偏移量。