Лінійна регресія з обмеженням нахилу


18

Я хочу виконати дуже просту лінійну регресію в R. Формула така ж проста, як . Однак я хотів би, щоб ухил ( ) знаходився всередині інтервалу, скажімо, між 1,4 і 1,6.ay=ax+ba

Як це можна зробити?

Відповіді:


24

Я хочу виконати ... лінійну регресію в Р. ... Я хотів би, щоб ухил знаходився всередині інтервалу, скажімо, між 1,4 і 1,6. Як це можна зробити?

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

  • підходять до регресії. Якщо це в межах, ви закінчили.

  • Якщо це не в межах, встановіть нахил до найближчої межі та

  • оцініть перехоплення як середнє значення за всіма спостереженнями.(у-ах)

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

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

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

-

Редагувати, щоб відповісти на подальше запитання -

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

Зверніть увагу: у моєму прикладі нижче, - перехоплення, а - нахил (більш поширена умова у статистиці). Я зрозумів, як поставив сюди, що ти почав навпаки; Я, однак, залишу приклад "відсталий" стосовно вашого питання.bаб

По-перше, встановіть деякі дані з "справжнім" нахилом всередині діапазону:

 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-значень, але я не впевнений, наскільки вони значущі / інтерпретовані.

То як порівняння моєї пропозиції (1)? (тобто встановіть нахил до найближчої межі та середнє значення залишків для оцінки перехоплення)у-бх

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

Це та сама оцінка ...

На малюнку нижче синя лінія є найменшими квадратами, а червона - найменшими обмеженими квадратами:

обмежена і лінія ЛС


Дякую за цю відповідь, але ... ви могли б навести приклад, використовуючи будь-яку з цих функцій?
Iñigo Hernáez Corres

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 (та багатьох інших пакетах).

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


5
Це розумно, але ви впевнені, що це буде працювати, як описано? Мені здається, відповідним підходом було б усунення тренду (1,6 + 1,4) / 2 = 1,5 і потім керування параметром хребта до тих пір, поки абсолютне значення нахилу не буде меншим або рівним 0,1.
whuber

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

Хоча я ціную ваше підтвердження моїх коментарів, але це відволікає зміст вашої відповіді. Ми всі в цьому разом, щоб покращити нашу роботу, де можна, тому достатньо визнання, що ви діяли на мої пропозиції. Для цього ви заслуговуєте на збільшення репутації. Якщо ви перенесені на додаткові зміни, будь ласка, впорядкуйте текст, видаливши цей зайвий матеріал.
whuber

Зайвий матеріал відредагований, однак мені подобається співпраця і завжди прагну надати співпрацівники заслуги, яку вони заслуговують, і все ще думаю, що морально ти заслуговуєш половини голосів. ; o)
Дікран Марсупіал

10

а

а

Цей результат все ще дасть достовірні інтервали параметрів, що цікавлять (звичайно, осмисленість цих інтервалів буде ґрунтуватися на обґрунтованості вашої попередньої інформації про схил).


+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.