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.
Como isso pode ser feito?
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.
Como isso pode ser feito?
Respostas:
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.
(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.
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.
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:

nlspara fazê-lo.
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)
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).
Outra abordagem pode ser reformular sua regressão como um problema de otimização e usar um otimizador. Não tenho certeza se pode ser reformulado dessa maneira, mas pensei nessa questão quando li esta postagem no blog sobre otimizadores de R:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html