Hilfe! Regressionslinie will einfach nicht

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

Antworten
Markus210588
Beiträge: 2
Registriert: Sa Feb 09, 2019 12:57 pm

Hilfe! Regressionslinie will einfach nicht

Beitrag von Markus210588 »

Hallo allerseits,

ich habe ein grundlegendes Problem damit, Kurven meiner gefitteten Funktion mit predictions in Plots zu legen. Hier ein aktuelles Beispiel, bei dem mein kleines R-Einmaleins in R-atlosigkeit mündet:

Es ist bereits erkennbar, dass es sich nicht um eine lineare Regression handelt (Grafik weiter unten). Daher habe ich verschiedene Funktionen ausprobiert und getestet.

mod <-glm(Grundfl..ha ~ Year, data=Grundfl)
mod1<- glm(log(Grundfl..ha) ~ Year, data=Grundfl)
mod2 <- glm(log(Grundfl..ha) ~ Year + I(Year^2), data=Grundfl)

mod ist die normale lineare Funktion.
summary(mod2) ergab den niedrigsten AIC-Wert und stellt somit die am besten passende Funktion dar (zumindest habe ich das so in meinem Statistics-with-R- Kurs gelernt).

Ich möchte nun eine Linie in den Plot legt, die den Anstieg meiner Grundfläche/ha (y-Achse) bestmöglich nachbildet. Sprich bei der die residuals am geringsten sind:

newdata<- data.frame("Year" = seq(2010,2018,1))
preds <- predict(mod2, newdata=newdata,se.fit=T)
lines(newdata$Year, preds$fit)

Das ist mein Code für die Linie. Aber aus irgendeinem Grund sieht das dann so aus:
Grundfläche mit linie.jpeg
Bei der linearen Funktion (mod) passt es viel besser:
grundfläche mit linearer linie.jpeg
Aber das steht im Gegensatz zu dem Test, welche Funktion am besten passt!

Wer kann mich hier auf meinen Denkfehler hinweisen?

Vielen Dank schon mal für jedwede Hilfe!
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Hilfe! Regressionslinie will einfach nicht

Beitrag von EDi »

predict gibt dir log(Grundfl..ha) zurück, musst du also noch rücktransformieren.

Ich wende transformationen immer außerhalb von der Modelspezifikation an.
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.
Markus210588
Beiträge: 2
Registriert: Sa Feb 09, 2019 12:57 pm

Re: Hilfe! Regressionslinie will einfach nicht

Beitrag von Markus210588 »

Vielen Dank, das hat mir weiter geholfen!

Das ganze sieht nun so aus:
Grundflächenentwicklung per Finca.jpeg
Leide habe ich noch nicht verstanden, wie genau das funktioniert bzw was an Logik dahinter steckt.

Der code, um eine dieser Linien einzufügen sieht so aus:
newdata<- data.frame("Year" = seq(2012,2018,1))
preds <- predict(mod_Casas, newdata=newdata,se.fit=T)
lines(newdata$Year, preds$fit, col="red", lty=1)

Hier funktioniert es auch, aber wie oft, wenn ich dieses Prinzip bei einer anderen Tabelle mit einer anderen Funktion verwende, klappt es nicht.
Oft kommt das:

Warning message:
'newdata' hat 46 Zeilen , aber die gefundenen Variablen haben 375 Zeilen

Und/ Oder das:
Error in xy.coords(x, y) : 'x' and 'y' lengths differ

Ich weiß, dass die Funktion und der Plot nicht übereinstimmen, aber warum?

Hier ein Beispiel, bei dem ich genau dieses Problem habe:
Funktion:
mod_Cebo_La_Virgen_mix <- lm(Krone$Diameter_Cebo_La_Virgen[Krone$Mono.Mix=="mix"] ~ Krone$DBH_Cebo_La_Virgen[Krone$Mono.Mix=="mix"])
Plot:
plot(Krone$Diameter_Cebo_La_Virgen[Krone$Mono.Mix=="mix"] ~ Krone$DBH_Cebo_La_Virgen[Krone$Mono.Mix=="mix"],
xlab="DBH", ylab="Diameter", main="La Virgen/San Rafael Cebo", col ="red", xlim=c(0,45), ylim=c(0,9))
test.jpeg
Warum kommt hier die Fehlermeldung? Meine Funktion und mein Plot fragen genau dieselben Daten ab.

Vielen Dank auch schon mal im Voraus!
Ich bin wirklich für jede Hilfe dankbar
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Hilfe! Regressionslinie will einfach nicht

Beitrag von EDi »

Warning message:
'newdata' hat 46 Zeilen , aber die gefundenen Variablen haben 375 Zeilen
Das kenne ich nur wenn newdata & data unterschiedliche Spaltennamen haben.

Und hier wird auch schon der Grund dafür geliefert:

Code: Alles auswählen

mod_Cebo_La_Virgen_mix <- lm(Krone$Diameter_Cebo_La_Virgen[Krone$Mono.Mix=="mix"] ~ Krone$DBH_Cebo_La_Virgen[Krone$Mono.Mix=="mix"])
Bitte das data= argument nutzen und das subsetting außerhalb machen. Also

Code: Alles auswählen

df_subset <- Krone[Krone$Mono.Mix=="mix", ]
mod <- lm(Diameter_Cebo_La_Virgen ~ DBH_Cebo_La_Virgen, data = df_subset)
Du nimmst an, das R sehr schlau ist und deine Intention erkennt. Das ist aber R leider (oder zum Glück?) nicht...

Warum kommt hier die Fehlermeldung? Meine Funktion und mein Plot fragen genau dieselben Daten ab.

Ohne ein reproduzierbares Beispiel mag ich hier keine Vermutungen anstellen.
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.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilfe! Regressionslinie will einfach nicht

Beitrag von jogo »

lm() hat auch ein Argument subset=
Vielleicht geht also auch:

Code: Alles auswählen

mod <- lm(Diameter_Cebo_La_Virgen ~ DBH_Cebo_La_Virgen, data = Krone, subset=(Mono.Mix=="mix"))
Gruß, Jörg
Antworten