我正在对一组数据进行回归分析,我对这个数据集的主要兴趣是找到最能使估算的平均标准误差(SEE)最小化的回归线,而不仅仅是找到最佳线适合。我认为这两个是相同的,直到我注意到当我重新计算基于包含一组新数据的最佳拟合线时,SEE实际上增加了,而使用旧的回归方程产生了较低的SEE,即使包括新数据。 SEE计算如下......
SEE = abs((x1-x0)/ x0)
其中x1是估计值,x0是实际值。有没有人知道在R中制定代码的方法,以便计算的回归线最小化平均SEE而不是r2?或者,是否有人知道为什么最佳拟合线不会使平均SEE最小化?
答案 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”。 更确切地说,我们希望最小化误差函数
我们的方法是使用线性编程。定义辅助变量“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]”等于“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
由于两个原因,这些值是不同的: