Я хочу выполнить очень простую линейную регрессию в R
. Формула так же проста, как . Однако я бы хотел, чтобы наклон ( ) находился внутри интервала, скажем, между 1,4 и 1,6.
Как это может быть сделано?
Я хочу выполнить очень простую линейную регрессию в R
. Формула так же проста, как . Однако я бы хотел, чтобы наклон ( ) находился внутри интервала, скажем, между 1,4 и 1,6.
Как это может быть сделано?
Ответы:
Я хочу выполнить ... линейную регрессию в R. ... Я бы хотел, чтобы наклон находился внутри интервала, скажем, между 1,4 и 1,6. Как это может быть сделано?
(i) Простой способ:
соответствовать регрессии. Если это в границах, все готово.
Если это не в границах, установите наклон до ближайшей границы, и
оцените пересечение как среднее значение по всем наблюдениям.
(ii) Более сложный способ: сделать наименьших квадратов с рамками на склоне; во многих подпрограммах оптимизации реализованы ограничения блока, например, nlminb
(которые поставляются с R).
Редактировать: фактически (как упомянуто в примере ниже), в vanilla R, nls
можно делать ограничения блока; как показано в примере, это действительно очень легко сделать.
Вы можете использовать ограниченную регрессию более напрямую; Я думаю, что pcls
функция из пакета "mgcv" и nnls
функция из пакета "nnls" оба делают.
-
Изменить, чтобы ответить на дополнительный вопрос -
Я собирался показать вам, как использовать его с nlminb
тех пор, как это идет с R, но я понял, что nls
уже использует те же самые подпрограммы (процедуры PORT) для реализации ограниченных наименьших квадратов, так что мой пример ниже делает этот случай.
NB: в моем примере ниже, - это точка пересечения, а 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-значения, но я не уверен, насколько они значимы / интерпретируемы.
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 (и многих других пакетах).
Однако простое решение Glen_b (i) мне кажется разумным (+1)
Этот результат все равно даст достоверные интервалы параметров, представляющих интерес (разумеется, значимость этих интервалов будет основываться на обоснованности вашей предыдущей информации о уклоне).
Другой подход может состоять в том, чтобы переформулировать вашу регрессию как проблему оптимизации и использовать оптимизатор. Я не уверен, можно ли это переформулировать таким образом, но я подумал об этом вопросе, когда читал эту запись в блоге на R-оптимизаторах:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html