估计标准误差的回归线

时间:2015-07-24 03:34:27

标签: r regression

我正在对一组数据进行回归分析,我对这个数据集的主要兴趣是找到最能使估算的平均标准误差(SEE)最小化的回归线,而不仅仅是找到最佳线适合。我认为这两个是相同的,直到我注意到当我重新计算基于包含一组新数据的最佳拟合线时,SEE实际上增加了,而使用旧的回归方程产生了较低的SEE,即使包括新数据。 SEE计算如下......

SEE = abs((x1-x0)/ x0)

其中x1是估计值,x0是实际值。有没有人知道在R中制定代码的方法,以便计算的回归线最小化平均SEE而不是r2?或者,是否有人知道为什么最佳拟合线不会使平均SEE最小化?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,可以通过一个名为线性规划的方法解决,使用R库“lpSolve”:

library(lpSolve)

regression_1 <- function( data )
{
  n   <- nrow(data)

  L.obj <- c( rep(1,n), 0, 0 )  
  L.con <- rbind( cbind( diag(data$y),  data$x,  matrix(1,n,1) ),
                  cbind( diag(data$y), -data$x, -matrix(1,n,1) ) )  
  L.rhs <- matrix( cbind( data$y, -data$y ), 2*n, 1 )  
  L.dir <- rep(">=",2*n)

  M <- lp("min", L.obj, L.con, L.dir, L.rhs )  
  a <- M["solution"][[1]][n+1]
  b <- M["solution"][[1]][n+2]

  return ( c(a,b) )
}

#--------------------------------------------------------------------

Error <- function( data, ab )
{
  ab <- unlist(ab)
  sum( abs((ab[1]*data$x+ab[2]-data$y)/data$y) )
}

#====================================================================
# Example:

data.x <- 0:12
data.y <- (3.0+0.3*data.x) * (1+sample(-150:150,length(data.x),TRUE)/1000)
data <- data.frame( x = data.x,
                    y = data.y  )

ab <- regression_1(data)

N <- 30
eps <- (-N:N)/1000
neighborhood <- array( unlist(expand.grid(ab[1]+eps,ab[2]+eps)), c(2*N+1,2*N+1,2))

E <- apply(neighborhood,c(1,2),function(ab_plus_eps){Error(data,ab_plus_eps)})

t(data)
min(E)
Error(data,ab)
ab

令“n”为数据框“data”中的行数并假设

  • y [i]是给定x [i]和

  • 的测量值
  • y [i]对每个i都是正面的。 (如果允许正值和负值, 使用下面的错误函数我们在0附近遇到了问题。)

(所以“x”和“y”分别对应问题的表述中的“X1”和“X0”。)

目标是通过斜率“a”和y轴截距“b”的线性函数估计“y”。 更确切地说,我们希望最小化误差函数

  • 错误(a,b)&lt; - sum(abs((a * x + b-y)/ y)。

我们的方法是使用线性编程。定义辅助变量“u [1],...,u [n + 2]”。 对于每个i&lt;“n”,后来“u [i]”将等于“abs((a * x [i] + b)/ y)” 并且“u [n + 1],u [n + 2]将分别等于”a“和”b“的最佳值。 对于这个

  • 最小化函数“u [1] + ... + u [n]”使用约束
  • u [i] * y [i]&gt; = u [n + 1] * x [i] + u [n + 2] -y [i]和
  • u [i] * y [i]&gt; = -u [n + 1] * x [i] -u [n + 2] + y [i]对于每个i <= n。

最小化“u [1] + ... + u [n]”时,“u [i]”等于“abs((u [n + 1] * x [i] + u [n 2])/ Y [i]于” 对于每个i&lt; =“n”。否则,“y [i]”的值可以减少,保持所有其他“u [j]” 固定。考虑到这一点,在上述约束条件下,函数“u [1] + ... + u [n]” 如果“u [n + 1]”和“u [n + 2]”分别是“a”和“b”的最佳值,则是最小的。

以下是示例的输出:

> t(data)
   [,1]   [,2]   [,3]   [,4]   [,5]   [,6] [,7]   [,8]   [,9]  [,10]  [,11]   [,12]  [,13]
x 0.000 1.0000 2.0000 3.0000 4.0000 5.0000 6.00 7.0000 8.0000 9.0000 10.000 11.0000 12.000
y 3.081 3.4353 3.2472 4.4772 3.7758 4.4055 5.04 5.5131 5.4378 5.5119  5.784  6.0102  5.907

> min(E)
[1] 0.6575712

> Error(data,ab)
[1] 0.6575712

> ab
[1] 0.2701 3.0810

进行比较:

> lm(data$y~data$x)

Call:
lm(formula = data$y ~ data$x)

Coefficients:
(Intercept)       data$x  
     3.1741       0.2611  

> Error(data,c(0.2611,3.1741))
[1] 0.67915

由于两个原因,这些值是不同的:

  • “lm”最小化回归线和采样数据之间的平方距离,而不是距离的绝对值。
  • 在“lm”使用的错误术语中,没有除以“y”值。 (特别是,上面提到的0附近没有问题。)