R最小化绝对误差

时间:2014-02-18 05:53:45

标签: r

这是我的设置

obs1<-c(1,1,1)
obs2<-c(0,1,2)
obs3<-c(0,0,3)

absoluteError<-function(obs,x){
  return(sum(abs(obs-x)))
}

Example:
> absoluteError(obs2,1)
[1] 2

对于观察的随机向量,我想找到一个最小化器x,它最小化观察值和所有x的向量之间的绝对误差。例如,显然最小化absoluteError(obs1,x)的论点是x = 1,因为这会导致误差为0.如何找到随机观测向量的最小化器?我想这是一个线性编程问题,但我以前从未在R中实现过。

2 个答案:

答案 0 :(得分:3)

obs的中位数是绝对误差的最小值。以下是如何尝试证明这一点的草图:

设n个观测值的中位数obs为m。调用obs和m f(obs,m)之间的绝对误差。

案例n是奇数:
考虑f(obs,m + delta),其中delta是一些非零数字。假设delta为正 - 则存在(n-1)/ 2 +1个观测值,其误差大于f(obs,m)。剩余的(n-1)/ 2观测值误差最多小于f(obs,m)。所以f(obs,m + delta)-f(obs,m)> = delta。 (如果delta为负,则可以进行相同的参数。)因此,在这种情况下,中位数是唯一的最小值。因此,对于任何非零delta,f(obs,m + delta)> f(obs,m),因此m是f的最小化。

案例n是偶数:
基本上与上面相同的逻辑,除了在这种情况下,集合中两个最内部数字之间的任何数字将是最小化。

答案 1 :(得分:2)

我不确定这个答案是否正确,即使是这样我也不确定这是你想要的。不过,我正在捅它。

我认为你在谈论的是“最小绝对偏差”,这是一种与“最小二乘”不同的回归形式。

如果是这样,我发现这个R代码用于解决最小绝对偏差回归:

fabs=function(beta0,x,y){
  b0=beta0[1]
  b1=beta0[2]
  n=length(x)
  llh=0
     for(i in 1:n){
          r2=(y[i]-b0-b1*x[i])
          llh=llh + abs(r2)
     }
  llh
}

g=optim(c(1,1),fabs,x=x,y=y)

我在这里找到了代码:

http://www.stat.colostate.edu/~meyer/hw12ans.pdf

假设您正在讨论最小绝对偏差,如果您想从头开始在R中使用解决方案而不是使用optim的解决方案,则可能对上述代码不感兴趣。

上面的代码用于带有截距和一个斜率的回归线。我修改了如下代码来处理只有截距的回归:

y <- c(1,1,1)
x <- 1:length(y)

fabs=function(beta0,x,y){
  b0=beta0[1]
  b1=0
  n=length(x)
  llh=0
    for(i in 1:n){
       r2=(y[i]-b0-b1*x[i])
       llh=llh + abs(r2)
    }
  llh
}

# The commands to get the estimator

g = optim(c(1),fabs,x=x,y=y, method='Brent', lower = (min(y)-5), upper = (max(y)+5))
g

直到今晚,我才不熟悉(即,没有听说过)至少绝对的偏差。所以,希望我的修改是相当合理的。

使用y <- c(1,1,1)参数估算值为1(我认为您说的是正确答案):

$par
[1] 1

$value
[1] 1.332268e-15

$counts
function gradient 
      NA       NA 

$convergence
[1] 0

$message
NULL

使用y <- c(0,1,2)参数估算为1

$par
[1] 1

$value
[1] 2

$counts
function gradient 
      NA       NA 

$convergence
[1] 0

$message
NULL

使用y <- c(0,0,3)参数估算为0(您说的是正确答案):

$par
[1] 8.613159e-10

$value
[1] 3

$counts
function gradient 
      NA       NA 

$convergence
[1] 0

$message
NULL

如果您想从头开始编写R代码,则上面链接文件中的其他R代码可能会有所帮助。

或者,也许可以从源文件中提取相关代码。

或者,也许其他人可以在接下来的24小时内提供所需的代码(并纠正我的任何错误)。

如果您从头开始编写代码,请将其作为答案发布,因为我希望自己能够看到它。