Если я правильно понял проблему правильно, это может быть решена с помощью метода, называемого линейного программирования, с помощью 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
Пусть «п» будет он число строк в кадре данных " данные»и предполагает, что
у [I] является измеренным значением, приведенным х [г] и
у [I] положительны для каждого г. (Если положительные и отрицательные значения были допущены, с помощью ниже функции ошибки у нас была проблема около 0.)
(Так что «х» и «у» соответствуют «X1» и «X0» в постановка вопроса, соответственно.)
Целью является оценка «y» линейной функцией с наклоном «a» и y-перехватом «b». Точнее мы хотим минимизировать функцию ошибки
- Ошибка (а, б) <. - сумма (абс ((а * х + по)/у)
Наш подход заключается в использовании линейное программирование Определить вспомогательные переменные «u [1], ..., u [n + 2]». Позже «u [i]» станет равным «abs ((a * x [i] + b)/у) «для каждого г <„п“ и» и [п + 1], и [п + 2] станет равным оптимальных значений „а“ и „б“, соответственно. для этого
- свести к минимуму функцию «u [1] + ... + u [n]» suject к ограничениям
- u [i] * y [i]> = u [n + 1] * x [i] + u [n + 2] -y [i] и
- u [i] * y [i]> = -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 < =" n ". В противном случае значение" y [i] "может уменьшаться, сохраняя все остальные" u [j] "'s Принимая это во внимание, при указанных выше ограничениях функция «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», нет деления на «y» -значения. (В частности, у нас нет проблемы около 0, упомянутой выше.)
Каковы ваши данные? Есть ли группа гетероскедастичности? – jenesaisquoi
Я не уверен. Данные лог-трансформируются, так что это может быть. – user2352714