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?
fonte
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?
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, nls
pode 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 pcls
função do pacote "mgcv" e a nnls
função do pacote "nnls" funcionam.
-
Editar para responder à pergunta de acompanhamento -
Eu estava indo para mostrar como usá-lo nlminb
desde que vem com R, mas percebi que nls
já 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 summary
ele, 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:
nls
para 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)
fonte
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).
fonte
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
fonte