Ist es in R (oder allgemein) möglich, Regressionskoeffizienten als bestimmtes Vorzeichen zu erzwingen?


10

Ich arbeite mit einigen Daten aus der realen Welt und die Regressionsmodelle liefern einige kontraintuitive Ergebnisse. Normalerweise vertraue ich der Statistik, aber in Wirklichkeit können einige dieser Dinge nicht wahr sein. Das Hauptproblem, das ich sehe, ist, dass eine Zunahme einer Variablen eine Zunahme der Antwort verursacht, wenn sie tatsächlich negativ korreliert werden müssen.

Gibt es eine Möglichkeit, für jeden der Regressionskoeffizienten ein bestimmtes Vorzeichen zu erzwingen? Jeder R-Code, um dies zu tun, wäre ebenfalls willkommen.

Vielen Dank für jede Hilfe!



1

Dieser Link r-bloggers.com/positive-coefficient-regression-in-r Ich glaube, er beantwortet die Frage von @ JRW zu R-Quadrat-Werten. Wie bereits erwähnt, ist Vorsicht geboten, bevor positive Koeffizientenwerte erzwungen werden.
Esme_

Antworten:


11
  1. Achten Sie auf die Unterscheidung zwischen der Randkorrelation und der Teilkorrelation (Korrelation abhängig von anderen Variablen). Sie können zu Recht ein anderes Vorzeichen haben.

    Das heißt, kann tatsächlich negativ sein, während der Regressionskoeffizient in einer multiplen Regression positiv ist. In diesen beiden Dingen besteht nicht unbedingt ein Widerspruch. Siehe auch Simpsons Paradoxon , das etwas verwandt ist (insbesondere das Diagramm). Im Allgemeinen können Sie nicht schließen, dass ein Regressionskoeffizient nur aufgrund eines Arguments über die marginale Korrelation ein Vorzeichen haben muss.corr(Y,Xi)

  2. Ja, es ist sicherlich möglich, Regressionskoeffizienten auf oder * zu beschränken. Es gibt verschiedene Möglichkeiten, dies zu tun. Einige davon können in R leicht genug durchgeführt werden, beispielsweise über . Siehe auch die Antworten auf diese Frage, in denen eine Reihe von R-Paketen und andere mögliche Ansätze erwähnt werden.000nnls

    Ich warne Sie jedoch davor, die Punkte in 1. hastig zu ignorieren, nur weil viele davon leicht zu implementieren sind.

    * (Sie können Programme verwenden, die nicht negativ sind, um nicht positiv zu machen, indem Sie die entsprechende Variable negieren.)


10

Es mag so etwas geben, aber ich würde sagen, dass es unter Ihren Umständen nicht ratsam ist.

Wenn Sie ein Ergebnis haben, das auch unmöglich ist:

1) Es liegt ein Problem mit Ihren Daten vor. 2) Es liegt ein Problem mit Ihrer Definition von "unmöglich" vor. 3) Sie verwenden die falsche Methode

Überprüfen Sie zunächst die Daten. Zweitens überprüfen Sie den Code. (Oder bitten Sie andere, es zu überprüfen). Wenn beide in Ordnung sind, passiert vielleicht etwas Unerwartetes.

Zum Glück haben Sie eine einfache "Unmöglichkeit" - Sie sagen, zwei Variablen können nicht positiv korreliert werden. Machen Sie also ein Streudiagramm und fügen Sie ein glatteres hinzu und sehen Sie. Ein einzelner Ausreißer könnte dies verursachen. oder es könnte eine nichtlineare Beziehung sein. Oder etwas anderes.

Aber wenn Sie Glück haben, haben Sie etwas Neues gefunden. Wie mein Lieblingsprofessor sagte: "Wenn Sie nicht überrascht sind, haben Sie nichts gelernt".


(+1 an Peter und Glen) @JRW - Wenn Sie das Schild reparieren, möchte ich eine Fliege an der Wand sein, wenn Sie versuchen, Ihrem Publikum den Koeffizienten, den Sie "erhalten" haben, und sein Konfidenzintervall zu erklären. Außerdem könnten sie zu Recht fragen: Haben Sie das Zeichen und / oder die Reichweite anderer repariert? Wenn nicht, warum nicht?
Rolando2

6

Um Ihre spezifische Frage zu beantworten, können Sie das Paket nnls ausprobieren, das die Regression der kleinsten Quadrate mit nicht negativen Einschränkungen für die Koeffizienten ausführt . Sie können es verwenden, um die gewünschten Zeichen zu erhalten, indem Sie die Zeichen der entsprechenden Prädiktoren ändern.

Übrigens ist hier eine sehr einfache Möglichkeit, einen Datensatz zu erstellen, um zu demonstrieren, wie es möglich ist, positive Korrelationen und negative Regressionskoeffizienten zu haben.

> 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  

Ich habe gerade ein bisschen mit diesem nnls-Paket herumgespielt. Gibt es eine Möglichkeit, einen angepassten R-Quadrat-Wert (oder etwas Äquivalentes) zu erhalten, oder müsste ich versuchen, ihn irgendwie selbst zu berechnen?
JRW
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.