Линейная регрессия с ограничением наклона


18

Я хочу выполнить очень простую линейную регрессию в R. Формула так же проста, как . Однако я бы хотел, чтобы наклон ( ) находился внутри интервала, скажем, между 1,4 и 1,6.Yзнак равноaИкс+бa

Как это может быть сделано?

Ответы:


24

Я хочу выполнить ... линейную регрессию в R. ... Я бы хотел, чтобы наклон находился внутри интервала, скажем, между 1,4 и 1,6. Как это может быть сделано?

(i) Простой способ:

  • соответствовать регрессии. Если это в границах, все готово.

  • Если это не в границах, установите наклон до ближайшей границы, и

  • оцените пересечение как среднее значение по всем наблюдениям.(Y-aИкс)

(ii) Более сложный способ: сделать наименьших квадратов с рамками на склоне; во многих подпрограммах оптимизации реализованы ограничения блока, например, nlminb(которые поставляются с R).

Редактировать: фактически (как упомянуто в примере ниже), в vanilla R, nlsможно делать ограничения блока; как показано в примере, это действительно очень легко сделать.

Вы можете использовать ограниченную регрессию более напрямую; Я думаю, что pclsфункция из пакета "mgcv" и nnlsфункция из пакета "nnls" оба делают.

-

Изменить, чтобы ответить на дополнительный вопрос -

Я собирался показать вам, как использовать его с nlminbтех пор, как это идет с R, но я понял, что nlsуже использует те же самые подпрограммы (процедуры PORT) для реализации ограниченных наименьших квадратов, так что мой пример ниже делает этот случай.

NB: в моем примере ниже, - это точка пересечения, а b - это уклон (более распространенное соглашение в статистике). После того, как я это здесь изложил, я понял, что вы начали наоборот; Я собираюсь оставить пример «задом наперед» относительно вашего вопроса.aб

Сначала настройте некоторые данные с истинным наклоном внутри диапазона:

 set.seed(seed=439812L)
 x=runif(35,10,30)
 y = 5.8 + 1.53*x + rnorm(35,s=5)  # population slope is in range
 plot(x,y)
 lm(y~x)

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
     12.681        1.217  

... но оценка LS далеко за ее пределами, просто вызванная случайным изменением. Итак, давайте использовать ограниченную регрессию в nls:

 nls(y~a+b*x,algorithm="port",
   start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))

Nonlinear regression model
  model: y ~ a + b * x
   data: parent.frame()
    a     b 
9.019 1.400 
 residual sum-of-squares: 706.2

Algorithm "port", convergence message: both X-convergence and relative convergence (5)

Как видите, вы получаете уклон прямо на границе. Если вы передадите ему подобранную модель, вы summaryполучите стандартные ошибки и t-значения, но я не уверен, насколько они значимы / интерпретируемы.

Y-бИкс

 b=1.4
 c(a=mean(y-x*b),b=b)
       a        b 
9.019376 1.400000

Это та же оценка ...

На графике ниже синяя линия - это наименьшие квадраты, а красная линия - это наименьшие квадраты с ограничениями:

ограниченная и LS линия


Спасибо за этот ответ, но ... не могли бы вы привести пример, используя любую из этих функций?
Иньго Эрнаес Коррес

1
+1 Поиск доверительных интервалов в оценках параметров будет проблемой в любом случае.
whuber

@ IñigoHernáezCorres смотрите обновление к моему ответу, где я иллюстрирую, nlsкак это сделать.
Glen_b

+1 отличный ответ со связями о двух способах сделать это!
Haitao Du

15

Второй метод Glen_b, использующий метод наименьших квадратов с ограничением коробки, может быть легче реализован с помощью регрессии гребня. Решение регрессии гребня можно рассматривать как лагранжиан для регрессии с ограничением на величину нормы вектора веса (и, следовательно, его наклон). Поэтому, следуя предложенному ниже предложению Вубера, подход будет заключаться в том, чтобы вычесть тренд (1.6 + 1.4) / 2 = 1.5, а затем применить регрессию гребня и постепенно увеличивать параметр гребня, пока величина наклона не станет меньше или равна 0,1.

Преимущество этого подхода состоит в том, что не требуются причудливые инструменты оптимизации, а только регрессия гребня, которая уже доступна в R (и многих других пакетах).

Однако простое решение Glen_b (i) мне кажется разумным (+1)


5
Это умно, но вы уверены, что это будет работать, как описано? Мне кажется, подходящим подходом было бы удалить тренд (1.6 + 1.4) / 2 = 1.5 и затем управлять параметром гребня, пока абсолютное значение уклона не станет меньше или равно 0,1.
whuber

1
да, это действительно лучшее предложение. Метод регрессии гребня действительно более уместен, если ограничение по величине склона, это звучит как довольно странная проблема! Мой ответ был первоначально вдохновлен комментарием Glen_b об ограничениях блоков, регрессия гребня в основном просто более простой способ реализации ограничений блоков.
Дикран Marsupial

Хотя я ценю ваше признание моих комментариев, imho это отвлекает от содержания вашего ответа. Мы все вместе работаем над тем, чтобы улучшить нашу работу везде, где можем, поэтому достаточно признания, что вы приняли мои предложения. За это вы заслуживаете прироста репутации. Если вы хотите внести дополнительные изменения, рассмотрите возможность оптимизации текста, удалив этот лишний материал.
whuber

Отредактированный лишний материал, однако я наслаждаюсь сотрудничеством и всегда стремлюсь дать сотрудникам кредит, которого они заслуживают, и все же думаю, что морально вы заслуживаете половину голосов. ; о)
Дикран Сумчатый

10

a

a

Этот результат все равно даст достоверные интервалы параметров, представляющих интерес (разумеется, значимость этих интервалов будет основываться на обоснованности вашей предыдущей информации о уклоне).


+1, это была моя первая мысль. Мне нравятся другие предложения, но это кажется мне лучшим.
gung - Восстановить Монику

0

Другой подход может состоять в том, чтобы переформулировать вашу регрессию как проблему оптимизации и использовать оптимизатор. Я не уверен, можно ли это переформулировать таким образом, но я подумал об этом вопросе, когда читал эту запись в блоге на R-оптимизаторах:

http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.