Regressão linear com restrição de inclinação


18

Eu quero executar uma regressão linear muito simples em R. A fórmula é tão simples quanto . No entanto, eu gostaria que a inclinação ( ) estivesse dentro de um intervalo, digamos, entre 1,4 e 1,6.y=ax+ba

Como isso pode ser feito?

Respostas:


24

Quero realizar ... regressão linear em R. ... Gostaria que a inclinação estivesse dentro de um intervalo, digamos, entre 1,4 e 1,6. Como isso pode ser feito?

(i) Maneira simples:

  • ajuste a regressão. Se estiver nos limites, está feito.

  • Se não estiver nos limites, defina a inclinação para o limite mais próximo e

  • estimar a interceptação como a média de sobre todas as observações.(y-umax)

(ii) Maneira mais complexa: faça menos quadrados com restrições de caixa na encosta; muitas rotinas de otimização implementam restrições de caixa, por exemplo nlminb(que vem com R).

Edit: na verdade (como mencionado no exemplo abaixo), no vanilla R, nlspode fazer restrições de caixa; como mostrado no exemplo, isso é realmente muito fácil de fazer.

Você pode usar a regressão restrita mais diretamente; Eu acho que a pclsfunção do pacote "mgcv" e a nnlsfunção do pacote "nnls" funcionam.

-

Editar para responder à pergunta de acompanhamento -

Eu estava indo para mostrar como usá-lo nlminbdesde que vem com R, mas percebi que nlsjá usa as mesmas rotinas (as rotinas PORT) para implementar mínimos quadrados restritos, então meu exemplo abaixo faz esse caso.

Nota: no meu exemplo abaixo, é a interceptação eb é a inclinação (a convenção mais comum em estatísticas). Percebi depois de colocar aqui que você começou o contrário; No entanto, vou deixar o exemplo "para trás" em relação à sua pergunta.umab

Primeiro, configure alguns dados com a inclinação 'true' dentro do intervalo:

 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  

... mas a estimativa LS está bem fora dela, apenas causada por variação aleatória. Então, vamos usar a regressão restrita em 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)

Como você vê, você tem uma inclinação bem no limite. Se você passar o modelo ajustado para summaryele, até produzirá erros padrão e valores t, mas não tenho certeza de quão significativos / interpretáveis ​​são.

y-bx

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

É a mesma estimativa ...

Na plotagem abaixo, a linha azul é de mínimos quadrados e a linha vermelha é de mínimos quadrados restritos:

linha restrita e LS


Obrigado por esta resposta, mas ... você poderia dar um exemplo usando alguma dessas funções?
Iñigo Hernáez Corres

1
+1 Encontrar intervalos de confiança nas estimativas de parâmetros será um desafio em qualquer caso.
whuber

@ IñigoHernáezCorres ver a atualização para a minha resposta, onde eu ilustro usando nlspara fazê-lo.
Glen_b -Reinstala Monica

+1 ótima resposta com conexões de duas maneiras!
Haitao Du

15

O segundo método de Glen_b, o uso de mínimos quadrados com restrição de caixa, pode ser implementado mais facilmente via regressão de crista. A solução para a regressão de crista pode ser vista como lagrangiana para uma regressão com um limite na magnitude da norma do vetor de peso (e, portanto, sua inclinação). Portanto, seguindo a sugestão do whuber abaixo, a abordagem seria subtrair uma tendência de (1,6 + 1,4) / 2 = 1,5 e, em seguida, aplicar a regressão da crista e aumentar gradualmente o parâmetro da crista até que a magnitude da inclinação seja menor ou igual a 0,1.

O benefício dessa abordagem é que não são necessárias ferramentas sofisticadas de otimização, apenas o ridge regresson, que já está disponível no R (e em muitos outros pacotes).

No entanto, a solução simples de Glen_b (i) me parece sensata (+1)


5
Isso é inteligente, mas você tem certeza de que funcionará como descrito? Parece-me que a abordagem apropriada seria remover uma tendência de (1,6 + 1,4) / 2 = 1,5 e depois controlar o parâmetro cume até que o valor absoluto da inclinação seja menor ou igual a 0,1.
whuber

1
Sim, essa é realmente uma sugestão melhor. A abordagem de regressão de cordilheira é realmente mais apropriada se a restrição for da magnitude da inclinação, parece um problema bastante estranho! Minha resposta foi originalmente inspirada no comentário de Glen_b sobre restrições de caixa, a regressão de cume é basicamente apenas uma maneira mais fácil de implementar as restrições de caixa.
Dikran Marsupial

Embora eu aprecie o seu reconhecimento dos meus comentários, mas isso distrai o conteúdo da sua resposta. Estamos todos juntos nisso para melhorar nosso trabalho sempre que possível, por isso é suficiente reconhecer que você agiu de acordo com minhas sugestões. Por isso, você merece o incremento na reputação. Se você for levado a fazer edições adicionais, considere otimizar o texto removendo esse material supérfluo.
whuber

Material supérfluo editado, porém gosto de colaborações e sempre procuro dar aos colaboradores o crédito que eles merecem, e ainda acho que moralmente você merece metade dos votos positivos. ; o)
Dikran Marsupial

10

uma

uma

Esse resultado ainda fornecerá intervalos credíveis dos parâmetros de interesse (é claro que a significância desses intervalos será baseada na razoabilidade de suas informações anteriores sobre a inclinação).


+1, esse foi meu primeiro pensamento também. Gosto das outras sugestões, mas isso me parece o melhor.
gung - Restabelece Monica

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.