Régression linéaire avec contrainte de pente

18

Je veux effectuer une régression linéaire très simple dans R. La formule est aussi simple que . Cependant, je voudrais que la pente ( ) soit à l'intérieur d'un intervalle, disons, entre 1,4 et 1,6.ay=ax+ba

Comment cela peut-il être fait?

Iñigo Hernáez Corres
la source

Réponses:

24

Je veux effectuer ... une régression linéaire dans R. ... Je voudrais que la pente soit à l'intérieur d'un intervalle, disons, entre 1,4 et 1,6. Comment cela peut-il être fait?

(i) Manière simple:

  • adapter la régression. Si c'est dans les limites, vous avez terminé.

  • S'il n'est pas dans les limites, définissez la pente sur la limite la plus proche, et

  • estimer l'ordonnée à l'origine comme la moyenne de sur toutes les observations.(yax)

(ii) Méthode plus complexe: faire les moindres carrés avec des contraintes de boîte sur la pente; de nombreuses routines d'optimisation implémentent des contraintes de boîte, par exemple nlminb(qui vient avec R).

Edit: en fait (comme mentionné dans l'exemple ci-dessous), dans vanilla R, nlspeut faire des contraintes de boîte; comme le montre l'exemple, c'est vraiment très facile à faire.

Vous pouvez utiliser la régression contrainte plus directement; Je pense que la pclsfonction du package "mgcv" et la nnlsfonction du package "nnls" font toutes les deux.

-

Modifier pour répondre à la question de suivi -

J'allais vous montrer comment l'utiliser avec nlminbpuisque cela vient avec R, mais j'ai réalisé qu'il nlsutilise déjà les mêmes routines (les routines PORT) pour implémenter les moindres carrés contraints, donc mon exemple ci-dessous le fait.

NB: dans mon exemple ci-dessous, est l'ordonnée à l'origine et est la pente (la convention la plus courante dans les statistiques). J'ai réalisé après l'avoir mis ici que vous avez commencé l'inverse; Je vais cependant laisser l'exemple «en arrière» par rapport à votre question.bab

Tout d'abord, configurez certaines données avec la «vraie» pente à l'intérieur de la plage:

 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  

... mais l'estimation LS est bien en dehors d'elle, juste causée par une variation aléatoire. Permet donc d'utiliser la régression contrainte dans 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)

Comme vous le voyez, vous obtenez une pente à droite sur la frontière. Si vous lui passez le modèle ajusté, summarycela produira même des erreurs standard et des valeurs t, mais je ne sais pas à quel point elles sont significatives / interprétables.

Alors, comment ma suggestion (1) se compare-t-elle? (c.-à-d. régler la pente à la limite la plus proche et faire la moyenne des résidus pour estimer l'ordonnée à l'origine)ybx

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

C'est la même estimation ...

Dans le graphique ci-dessous, la ligne bleue correspond aux moindres carrés et la ligne rouge aux moindres carrés contraints:

ligne contrainte et LS

Glen_b -Reinstate Monica
la source
Merci pour cette réponse mais ... pourriez-vous donner un exemple en utilisant l'une de ces fonctions?
Iñigo Hernáez Corres
1
+1 Trouver les intervalles de confiance sur les estimations de paramètres va être un défi de toute façon.
whuber
@ IñigoHernáezCorres voir la mise à jour de ma réponse, où j'illustre l'utilisation nlspour le faire.
Glen_b -Reinstate Monica
+1 grande réponse avec des connexions sur deux façons de le faire!
Haitao Du
15

La deuxième méthode de Glen_b, utilisant les moindres carrés avec une contrainte de boîte peut être plus facilement implémentée via la régression de crête. La solution à la régression des crêtes peut être considérée comme le lagrangien pour une régression avec une borne sur l'amplitude de la norme du vecteur de poids (et donc sa pente). Donc, suivant la suggestion de whuber ci-dessous, l'approche serait de soustraire une tendance de (1,6 + 1,4) / 2 = 1,5, puis d'appliquer une régression de crête et d'augmenter progressivement le paramètre de crête jusqu'à ce que l'amplitude de la pente soit inférieure ou égale à 0,1.

L'avantage de cette approche est qu'aucun outil d'optimisation sophistiqué n'est requis, juste ridge regresson, qui est déjà disponible dans R (et de nombreux autres packages).

Cependant la solution simple de Glen_b (i) me semble sensée (+1)

Dikran Marsupial
la source
5
C'est intelligent, mais êtes-vous sûr que cela fonctionnera comme décrit? Il me semble que l'approche appropriée serait de supprimer une tendance de (1,6 + 1,4) / 2 = 1,5 puis de contrôler le paramètre de crête jusqu'à ce que la valeur absolue de la pente soit inférieure ou égale à 0,1.
whuber
1
oui, c'est effectivement une meilleure suggestion. L'approche de régression de crête est vraiment plus appropriée si la restriction est sur l'amplitude de la pente, cela ressemble à un problème assez étrange! Ma réponse a été initialement inspirée par le commentaire de Glen_b sur les contraintes de boîte, la régression de crête est fondamentalement juste un moyen plus facile de mettre en œuvre les contraintes de boîte.
Dikran Marsupial
Bien que j'apprécie votre reconnaissance de mes commentaires, à mon humble avis, cela distrait du contenu de votre réponse. Nous sommes tous dans le même bateau pour améliorer notre travail partout où nous le pouvons, c'est donc assez de reconnaissance que vous avez donné suite à mes suggestions. Pour cela, vous méritez l'augmentation de la réputation. Si vous êtes amené à apporter des modifications supplémentaires, veuillez envisager de rationaliser le texte en supprimant ce matériel superflu.
whuber
Le matériel superflu édité, cependant j'aime les collaborations et cherche toujours à donner aux collaborateurs le crédit qu'ils méritent, et je pense toujours que vous méritez moralement la moitié des votes positifs. ; o)
Dikran Marsupial
10

a

a

Ce résultat donnera toujours des intervalles crédibles des paramètres d'intérêt (bien sûr, la signification de ces intervalles sera basée sur le caractère raisonnable de vos informations antérieures sur la pente).

Greg Snow
la source
+1, c'était aussi ma première pensée. J'aime les autres suggestions, mais cela me semble le meilleur.
gung - Rétablir Monica
0

Une autre approche pourrait être de reformuler votre régression en tant que problème d'optimisation et d'utiliser un optimiseur. Je ne sais pas si cela peut être reformulé de cette façon, mais j'ai pensé à cette question en lisant cet article de blog sur les optimiseurs R:

http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html

Wayne
la source