Я хочу виконати дуже просту лінійну регресію в R
. Формула така ж проста, як . Однак я хотів би, щоб ухил ( ) знаходився всередині інтервалу, скажімо, між 1,4 і 1,6.a
Як це можна зробити?
Я хочу виконати дуже просту лінійну регресію в R
. Формула така ж проста, як . Однак я хотів би, щоб ухил ( ) знаходився всередині інтервалу, скажімо, між 1,4 і 1,6.a
Як це можна зробити?
Відповіді:
Я хочу виконати ... лінійну регресію в Р. ... Я хотів би, щоб ухил знаходився всередині інтервалу, скажімо, між 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
Це та сама оцінка ...
На малюнку нижче синя лінія є найменшими квадратами, а червона - найменшими обмеженими квадратами:
nls
як це зробити.
Другий метод Glen_b, використовуючи найменші квадрати з обмеженням у коробці, може бути легше реалізований за допомогою регресії хребта. Рішення регресії хребта можна розглядати як лагранжана для регресії з обмеженою величиною норми вагового вектора (а отже, і його нахилу). Отже, виходячи із запропонованих нижче пропозицій, підходом було б відняти тенденцію (1,6 + 1,4) / 2 = 1,5, а потім застосувати регресію хребта і поступово збільшувати параметр конька, поки величина нахилу не буде меншою або дорівнює 0,1.
Перевага такого підходу полягає в тому, що не потрібні спеціальні інструменти для оптимізації, а лише регрес на хребті, який уже доступний в R (та багатьох інших пакетах).
Однак просте рішення (i) Glen_b здається мені розумним (+1)
Цей результат все ще дасть достовірні інтервали параметрів, що цікавлять (звичайно, осмисленість цих інтервалів буде ґрунтуватися на обґрунтованості вашої попередньої інформації про схил).
Іншим підходом може бути переформулювання регресії як проблема оптимізації та використання оптимізатора. Я не впевнений, чи можна це переформулювати таким чином, але я подумав над цим питанням, коли читав цю публікацію в блозі на R оптимізаторах:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html