Lineare Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
the_rod

Lineare Regression

Beitrag von the_rod »

Hallo Forum,

ich möchte eine lineare Regression berechnen unter der Bedingung, dass der Anstieg 1 ist.
Nach langem Suchen habe ich diese Lösung gefunden:

Code: Alles auswählen

linmodel2 <- lm(formula = y ~ offset(x), data = table)
oder

Code: Alles auswählen

slope <- 1
linmodel2 <- lm(formula = y ~ 1 + offset(x*slope), data = table)
Nur leider klappt es nicht so wie gewünscht, hier mein Minimalbeispiel:

Code: Alles auswählen

Curve_ID    <- c("curve_1", "curve_2", "curve_3", "curve_4", "curve_5", "curve_6", "curve_7", "curve_8", "curve_9", "curve_10")
x           <- c(2.5e-06, 1.25e-06, 6.25e-07, 3.125e-07, 1.56e-07, 7.8125e-08, 3.906250e-08, 1.953125e-08, 9.765625e-09, 4.882813e-09)
y           <- c(38001.886972, 71.366841, 24.365533, 13.003076, 8.356772, 3.562385, 2.548801, 1.406600, 1.431116, 1.311127)

table           <- data.frame(Curve_ID, x, y)
table[, "x"] 		<- log10(table[, "x"])
table[, "y"] 		<- table[, "y"] - 1
table[, "y"] 		<- log10(table[, "y"])

plot(y~x, data = table, pch = 8, xlab="log(cAntagonist)", ylab="log(r-1)", ylim = c(-10, 10), xlim = c(-10, 10), main = "Schild-Regression")

linmodel <- lm(
  formula = y ~ x,
  data = table
)

linmodel2 <- lm(
  formula = y ~ offset(x),
  data = table
)


# slope chosen by lm(...)
abline(linmodel, coef(linmodel), col="green")
abline(linmodel2, coef(linmodel2), col="red")
In dem Beispiel wird eine normale lineare Regression (grün) und eine lineare Regression mit "offset" (rot) berechnet. Die rote Linie fittet aber nicht ansatzweise die Punktmenge und hat auch keine Steigung von 1.

Ich hoffe ihr könnt mir weiter helfen.

Vielen Dank,
Markus
Dateianhänge
Plot der Regressionsgeraden
Plot der Regressionsgeraden
lm_slope_1.png (3.9 KiB) 1659 mal betrachtet
Zuletzt geändert von the_rod am Mo Nov 27, 2017 9:44 am, insgesamt 1-mal geändert.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Lineare Regression

Beitrag von jogo »

Hallo Markus,

willkommen im Forum!
Die Funktion offset() sehe ich zum ersten Mal. Mir ist auch noch nicht klar, ob es Dir bei Deinem Problem hilft:

Code: Alles auswählen

set.seed(42)
x <- 1:5 + rnorm(5)
offset(x)
Ich hätte eher gedacht an das Paket systemfit, bei dem man lineare Nebenbedingungen an die Koeffizienten des Modells formulieren kann. Vielleicht geht auch folgende Hilfskonstruktion:

Code: Alles auswählen

linmodel2 <- lm((y-x) ~ 1, data = table)  # bzw. (y - slope*x) ~ ...
(Da sollte als Schätzung für das Intercept mean(y-x) rauspurzeln)

Gruß, Jörg
p.s.:
Bitte lies viewtopic.php?f=20&t=29 und nutze Formatierungen.
the_rod

Re: Lineare Regression

Beitrag von the_rod »

Vielen Dank für deine schnelle Antwort.

Code: Alles auswählen

lm((y-x) ~ 1, data = table)
führt leider zur gleichen Regressionsgeraden wie im obigen Bild (rot).


Systemfit könnte ein guter Ansatz sein, nur leider weiß ich nicht wie ich die Slopebedingung einbauen soll. Folgendes Beispiel fittet eine normale lineare Regression:

Code: Alles auswählen

linmodel3 <- systemfit(y~x, data = table)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Lineare Regression

Beitrag von bigben »

Hi!

Von http://rfunction.com/archives/223 :
the offset term receives no coefficient estimate since its coefficient is set to 1


Mit anderen Worten: Der Koeffizient 1 wird nicht angezeigt, aber er wird z. B. bei predict berücksichtigt. Mit Deinem Beispiel:

Code: Alles auswählen

linmodel <- lm(
  formula = y ~ offset(x),
  data = table
)
summary(linmodel)

predictdata <- data.frame(x=1:10)
predict(object = linmodel, newdata = predictdata)

#oder grafisch:
plot(predict(object = linmodel, newdata = predictdata))
abline(linmodel$coefficients[1], 1)
In Summary erscheint der Koeffizient nicht, weil er nicht geschätzt wurde, aber mit immer um 1 steigendem x werden auch immer um 1 steigende Werte von predict ausgespuckt. abline hingegen scheint den Schuss nicht zu hören. Wie würde Donald Trump sagen? "Sad!"

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
the_rod

Re: Lineare Regression

Beitrag von the_rod »

Hallo Bernhard,

danke für deine Antwort. Versteh ich das richtig, dass "predict" mir die y-Werte der linearen Regression zu fest definierten x-Werten anzeigt.
Auf gut Deutsch offset() funktioniert, die Regressionsgerade muss nur anders angezeigt werden.

Vielleicht sollte ich mein Vorhaben genauer beschreiben. Ich möchte eine lineare Regression erstellen und feststellen ob die Steigung annähernd 1 ist.
Diesen Vergleich wollte ich mit einem F-Test und einer Vergleichsregression (Slope = 1) durchführen.

Viele Grüße,

Markus
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Lineare Regression

Beitrag von EDi »

die Steigung annähernd 1 ist.
Schau dir doch das 95% Konfidenzinterval um den Slope Parameter an. Wenn dieses die 1 inkludiert, ists nicht unterschiedlich zu 1.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Lineare Regression

Beitrag von bigben »

Hallo Markus,

ohne eine Definition von "ungefähr 1" könnte Dich der Test in die Irre führen, weil der immer gegen "exakt 1" testet. Klingt eher nach einer Anwendung für Bayes, kommt aber drauf an, was Du genau willst.

Ja, predict ist der vorgezeichnete Weg, in R neue Werte in ein Modell einzuspeisen. Dass dieses Offset-dingens Mist ist, brauchen wir nicht zu diskutierten.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Lineare Regression

Beitrag von jogo »

the_rod hat geschrieben: Mo Nov 27, 2017 2:03 pm

Code: Alles auswählen

lm((y-x) ~ 1, data = table)
führt leider zur gleichen Regressionsgeraden wie im obigen Bild (rot).
Wenn man eine solche Hilfskonstruktion verwendet, muss man für predicted values für y diese Hilfskonstruktion wieder auflösen:
"predicted values für y" <- "prediction aus dem Modell (y-x) ~ 1" + "die Werte von x"

Systemfit könnte ein guter Ansatz sein, nur leider weiß ich nicht wie ich die Slopebedingung einbauen soll. Folgendes Beispiel fittet eine normale lineare Regression:

Code: Alles auswählen

linmodel3 <- systemfit(y~x, data = table)
richtig:
Wenn man die Parameter nicht nutzt, mit denen die Nebenbedingungen formuliert werde, dann gibt es keinen Unterschied zu lm(y ~ x, ...).

Code: Alles auswählen

library("systemfit")
str(cars)
lm(dist ~ speed, data=cars)
systemfit(dist ~ speed, data=cars)

systemfit(dist ~ 1 + speed, data=cars, restrict.matrix = matrix(c(0,1), nrow=1, ncol=2), restrict.rhs = c(3))
Gruß, Jörg
Antworten