Ich möchte eine sehr einfache lineare Regression durchführen R
. Die Formel ist so einfach wie . Ich möchte jedoch, dass die Steigung ( ) in einem Intervall zwischen 1,4 und 1,6 liegt.a
Wie geht das?
Ich möchte eine sehr einfache lineare Regression durchführen R
. Die Formel ist so einfach wie . Ich möchte jedoch, dass die Steigung ( ) in einem Intervall zwischen 1,4 und 1,6 liegt.a
Wie geht das?
Antworten:
Ich möchte eine lineare Regression in R durchführen. Ich möchte, dass die Steigung in einem Intervall zwischen 1,4 und 1,6 liegt. Wie geht das?
(i) Einfacher Weg:
Passen Sie die Regression. Wenn es in Grenzen ist, sind Sie fertig.
Wenn es nicht innerhalb der Grenzen liegt, stellen Sie die Steigung auf die nächste Grenze ein, und
Schätzen Sie den Achsenabschnitt als Durchschnitt von über alle Beobachtungen.
(ii) Komplexerer Weg: Führe die kleinsten Quadrate mit Rahmenbeschränkungen am Hang aus. Viele Optimierungsroutinen implementieren Box-Einschränkungen, z. B. nlminb
(was mit R geliefert wird ).
Bearbeiten: Tatsächlich (wie im folgenden Beispiel erwähnt) kann Vanilla R nls
Box-Einschränkungen ausführen. Wie im Beispiel gezeigt, ist das wirklich sehr einfach.
Sie können die eingeschränkte Regression direkter verwenden. Ich denke, die pcls
Funktion aus dem Paket "mgcv" und die nnls
Funktion aus dem Paket "nnls" machen beide.
-
Bearbeiten, um die nachfolgende Frage zu beantworten -
Ich wollte Ihnen zeigen, wie man es verwendet, nlminb
da dies mit R einhergeht, aber ich erkannte, dass nls
bereits dieselben Routinen (die PORT-Routinen) zum Implementieren von erzwungenen kleinsten Quadraten verwendet werden. In meinem folgenden Beispiel ist dies der Fall.
NB: In meinem Beispiel unten ist der Achsenabschnitt und die Steigung (die üblichere Konvention in Statistiken). Nachdem ich es hier reingesteckt hatte, wurde mir klar, dass du anders herum angefangen hast. Ich werde das Beispiel jedoch in Bezug auf Ihre Frage "rückwärts" lassen.b
Richten Sie zuerst einige Daten mit der 'wahren' Steigung innerhalb des Bereichs ein:
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
... aber die LS-Schätzung liegt weit außerhalb, nur aufgrund zufälliger Abweichungen. Verwenden wir also die eingeschränkte Regression in 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)
Wie Sie sehen, erhalten Sie einen Hang direkt an der Grenze. Wenn Sie das angepasste Modell übergeben, summary
werden sogar Standardfehler und t-Werte erzeugt, aber ich bin nicht sicher, wie aussagekräftig / interpretierbar diese sind.
Wie vergleicht mein Vorschlag (1)? (dh setzen Sie die Steigung auf die nächste Grenze und mitteln Sie die Residuen , um den abzuschätzen)
b=1.4
c(a=mean(y-x*b),b=b)
a b
9.019376 1.400000
Es ist die gleiche Schätzung ...
In der folgenden Darstellung ist die blaue Linie die kleinste Quadrate und die rote Linie die eingeschränkte kleinste Quadrate:
nls
, um es zu tun.
Die zweite Methode von Glen_b, die kleinste Quadrate mit einer Box-Einschränkung verwendet, lässt sich einfacher über die Ridge-Regression implementieren. Die Lösung für die Gratregression kann als Lagrange für eine Regression mit einer Begrenzung der Größe der Norm des Gewichtsvektors (und damit seiner Steigung) angesehen werden. Entsprechend dem Vorschlag von Whuber würde der Ansatz darin bestehen, einen Trend von (1,6 + 1,4) / 2 = 1,5 zu subtrahieren und dann eine Gratregression anzuwenden und den Gratparameter allmählich zu erhöhen, bis die Größe der Steigung kleiner oder gleich 0,1 ist.
Der Vorteil dieses Ansatzes besteht darin, dass keine ausgefallenen Optimierungswerkzeuge erforderlich sind, sondern nur die Ridge-Regression, die bereits in R (und vielen anderen Paketen) verfügbar ist.
Die einfache Lösung von Glen_b (i) erscheint mir jedoch sinnvoll (+1)
Dieses Ergebnis liefert immer noch glaubwürdige Intervalle der interessierenden Parameter (die Aussagekraft dieser Intervalle hängt natürlich von der Plausibilität Ihrer vorherigen Informationen über die Steigung ab).
Ein anderer Ansatz könnte darin bestehen, Ihre Regression als Optimierungsproblem neu zu formulieren und einen Optimierer zu verwenden. Ich bin nicht sicher, ob es auf diese Weise umformuliert werden kann, aber ich habe mir diese Frage überlegt, als ich diesen Blog-Beitrag über R-Optimierer las:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html