Est-il possible en R (ou en général) de forcer les coefficients de régression à être un certain signe?

10

Je travaille avec des données du monde réel et les modèles de régression donnent des résultats contre-intuitifs. Normalement, je fais confiance aux statistiques, mais en réalité, certaines de ces choses ne peuvent pas être vraies. Le principal problème que je vois est qu'une augmentation d'une variable entraîne une augmentation de la réponse alors qu'en réalité, elles doivent être corrélées négativement.

Existe-t-il un moyen de forcer un signe spécifique pour chacun des coefficients de régression? Tout code R pour ce faire serait également apprécié.

Merci pour toute aide!

JRW
la source
9
Voir stat.columbia.edu/~gelman/stuff_for_blog/… .
Dimitriy V. Masterov
1
Peut être lié ici
Ce lien r-bloggers.com/positive-coefficient-regression-in-r je crois répond à la question de @ JRW sur les valeurs R au carré. Comme déjà commenté, il faut faire attention avant de forcer des valeurs de coefficient positives.
Esme_

Réponses:

11
  1. attention à la distinction entre la corrélation marginale et la corrélation partielle (corrélation conditionnelle à d'autres variables). Ils peuvent légitimement être de signe différent.

    corr(Oui,Xje)

  2. 00nnls

    Cependant, je vous déconseille d'ignorer à la hâte les points du point 1. simplement parce que beaucoup d'entre eux sont facilement mis en œuvre.

    * (vous pouvez utiliser des programmes qui ne sont pas négatifs pour faire non positifs en annulant la variable correspondante)

Glen_b -Reinstate Monica
la source
10

Il existe peut-être une telle solution, mais je dirais qu'elle n'est pas recommandée dans votre situation.

Si vous avez un résultat impossible:

1) Il y a un problème avec vos données 2) Il y a un problème avec votre définition de «impossible» ou 3) Vous utilisez la mauvaise méthode

Vérifiez d'abord les données. Deuxièmement, vérifiez le code. (Ou demandez aux autres de le vérifier). Si les deux vont bien, peut-être que quelque chose d'inattendu se produit.

Heureusement pour vous, vous avez une simple «impossibilité» - vous dites que deux variables ne peuvent pas être corrélées positivement. Alors, faites un nuage de points et ajoutez un lissage et voyez. Une seule valeur aberrante pourrait provoquer cela; ou ce pourrait être une relation non linéaire. Ou autre chose.

Mais si vous avez de la chance, vous avez trouvé quelque chose de nouveau. Comme disait mon professeur préféré "Si vous n'êtes pas surpris, vous n'avez rien appris".

Peter Flom - Réintégrer Monica
la source
(+1 à Peter et Glen) @JRW - Si vous réparez le panneau, j'aimerais être une mouche sur le mur lorsque vous essayez d'expliquer à votre public le coefficient que vous "avez obtenu" et son intervalle de confiance. De plus, ils pourraient légitimement demander: Avez-vous fixé le signe et / ou la portée des autres? Sinon, pourquoi pas?
rolando2
6

Pour répondre à votre question spécifique, vous pouvez essayer le package nnls qui fait la régression des moindres carrés avec des contraintes non négatives sur les coefficients. Vous pouvez l'utiliser pour obtenir les signes que vous voulez en changeant les signes des prédicteurs appropriés.

Soit dit en passant, voici un moyen très simple de créer un ensemble de données pour montrer comment il est possible d'avoir des corrélations positives et des coefficients de régression négatifs.

> n <- rnorm(200)
> x <- rnorm(200)
> d <- data.frame(x1 = x+n, x2= 2*x+n, y=x)
> cor(d)
      x1        x2         y
 x1 1.0000000 0.9474537 0.7260542
 x2 0.9474537 1.0000000 0.9078732
 y  0.7260542 0.9078732 1.0000000
> plot(d)
> lm(y~x1+x2-1, d)

Call:
lm(formula = y ~ x1 + x2 - 1, data = d)

Coefficients:
x1  x2  
-1   1  
Innuo
la source
Je viens de jouer un peu avec ce paquet nnls. Existe-t-il un moyen d'obtenir une valeur R au carré ajustée (ou quelque chose d'équivalent), ou devrais-je essayer de la calculer moi-même d'une manière ou d'une autre?
JRW