2015-07-24 5 views
2

Я делаю регрессионный анализ набора данных, и мой основной интерес для этого набора данных - найти линию регрессии, которая наилучшим образом минимизирует среднюю стандартную ошибку оценки (SEE), а чем просто найти линию наилучшего соответствия. Я думал, что эти два были одинаковыми, пока я не заметил, что когда я пересчитал линию наилучшего соответствия, основанную на включении нового набора данных, SEE фактически увеличилось, тогда как использование старого уравнения регрессии привело к снижению SEE, даже если оно включало новые данные. СМ рассчитывается следующим образом ...Линия регрессии для стандартной ошибки оценки

СМ = абс ((x1-x0)/х0)

где x1 представляет собой оцененное значение и х0 фактическое значение. Кто-нибудь знает способ формулировать код в R, чтобы расчетная линия регрессии минимизировала среднее значение SEE, а не r2? В качестве альтернативы, кто-нибудь знает, почему линия наилучшего соответствия не минимизирует среднее значение SEE?

+0

Каковы ваши данные? Есть ли группа гетероскедастичности? – jenesaisquoi

+0

Я не уверен. Данные лог-трансформируются, так что это может быть. – user2352714

ответ

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 

Пусть «п» будет он число строк в кадре данных " данные»и предполагает, что

  • у [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, упомянутой выше.)
Смежные вопросы