这是我的设置
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中实现过。
答案 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小时内提供所需的代码(并纠正我的任何错误)。
如果您从头开始编写代码,请将其作为答案发布,因为我希望自己能够看到它。