Seite 1 von 4
Logarithmische Regression
Verfasst: Di Aug 21, 2018 10:06 am
von RBuchi
Ich möchte mit R eine Logarithmische Regression berechnen und darstellen.
Habe schon herausgefunden das es mit dem Befehl nls() möglich ist.
Hier mein verzweifelter Versuch, der nur eine Fehlermeldung produziert.
w<-nls(y~a*lnx+b,data=DIA,start=DIA)
Error in nls(y ~ a * lnx + b, data = DIA, start = DIA) :
'data' must be a list or an environment
>
DIA ist meine Datenquelle, die Regression soll für SW SWF berechnet mersen
SW SWF
[1,] 160684.22 0.92
[2,] 120282.06 0.96
[3,] 302953.80 0.79
[4,] 181508.20 0.91 .
.
.
.[138,] 130709.66 1.68
Kann mir jemand mit einem einfachen Beispiel helfen ?
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 12:38 pm
von bigben
Was soll "lnx" sein? bestimmt meinst Du "log(x)", oder
Bist Du sicher, dass "DIA" sowohl der Datensatz als auch die Startwerte sein soll
Vielleicht
https://datascienceplus.com/first-steps ... sion-in-r/
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 1:40 pm
von RBuchi
Danke
Ich habe den Startwert jetzt weggelassen
<-nls(y~a*ln(x)+b,data=str(DIA))
zumindest die Fehlermeldung ist jetzt anders
num [1:252, 1:2] 160684 120282 302954 331684 181508 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:2] "SW" "SWF"
Error in nls(y ~ a * ln(x) + b, data = str(DIA)) :
'data' must be a list or an environment
>
>
> w
Error: object 'w' not found
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 2:00 pm
von jogo
Hallo RBuchi,
willkommen im Forum!
RBuchi hat geschrieben: ↑Di Aug 21, 2018 10:06 am
Ich möchte mit R eine Logarithmische Regression berechnen und darstellen.
Habe schon herausgefunden das es mit dem Befehl nls() möglich ist.
Hier mein verzweifelter Versuch, der nur eine Fehlermeldung produziert.
w<-nls(y~a*lnx+b,data=DIA,start=DIA)
Suchst Du die Werte für die Parameter a und b
DIA ist meine Datenquelle, die Regression soll für SW SWF berechnet mersen
SW SWF
[1,] 160684.22 0.92
[2,] 120282.06 0.96
[3,] 302953.80 0.79
[4,] 181508.20 0.91 .
.
.
.[138,] 130709.66 1.68
Das sieht nach einer Matrix aus. Es wäre besser, wenn es ein Dataframe wäre.
Kann mir jemand mit einem einfachen Beispiel helfen ?
Es könnte so aussehen:
Das liefert eine sehr knappe Ausgabe. Mehr gibt es mit:
Code: Alles auswählen
lReg <- lm(SWF ~ log(SW), data=as.data.frame(DIA))
summary(lReg)
Hier ein garantiert funktionierendes Beispiel:
Code: Alles auswählen
lR <- lm(Petal.Length ~ log(Sepal.Length), data=iris)
plot(Petal.Length ~ log(Sepal.Length), data=iris)
abline(lR)
Gruß, Jörg
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 3:26 pm
von bigben
Ergänzend:
Mit 'str(DIA)' meinte, ich, dass Du uns verrätst, was sich hinter dem Namen 'DIA' versteckt, indem Du die Antwort von R auf das Kommando 'str(DIA)' postest. Nicht, dass Du DIA durch 'str(DIA)' ersetzen sollst.
Eine Funktion 'ln' im Sinne von
gibt es in R nicht. Die Funktion für den natürlichen Logarithmus heißt 'log', wie in
LG,
Bernhard
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 3:41 pm
von RBuchi
Sorry, leider bin ich ein blutiger R Anfänger
Code: Alles auswählen
> str(DIA)
num [1:28, 1:3] 123823 461577 138929 192906 130580 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "SW" "SWF" "BRW"
>
mit dem Code von Jörg kommt das gleiche heraus wie mit EXCEL
Code: Alles auswählen
lm(SWF ~ log(SW), data=as.data.frame(DIA))
Coefficients:
(Intercept) log(SW)
2.709 -0.145
EXCEL
Ich verstehe den Code zwar noch nicht, aber das kommt noch.
Würde diese Funktion auch gerne plotten.
Mit einer linearen Regression hab ich es hinbekommen.
Hoffe ich nerve nicht mit meinen Anfängerfragen.
Danke
Gruss
Bernhard
Re: Logarithmische Regression
Verfasst: Di Aug 21, 2018 4:03 pm
von jogo
Hallo Bernhard,
RBuchi hat geschrieben: ↑Di Aug 21, 2018 3:41 pm
Sorry, leider bin ich ein blutiger R Anfänger
Code: Alles auswählen
> str(DIA)
num [1:28, 1:3] 123823 461577 138929 192906 130580 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:3] "SW" "SWF" "BRW"
>
jawohl, es ist eine Matrix. ... und unten offenbart sich auch, wie Du sie zusammengestöpselt hast; dort dann noch entsprechende Anmerkungen.
Code: Alles auswählen
mit dem Code von Jörg kommt das gleiche heraus wie mit EXCEL
[code]lm(SWF ~ log(SW), data=as.data.frame(DIA))
Coefficients:
(Intercept) log(SW)
2.709 -0.145
EXCEL
passt
Würde diese Funktion auch gerne plotten.
Mit einer linearen Regression hab ich es hinbekommen.
Du kannst nach dem Beispiel mit den iris-Daten vorgehen, das ich Dir geliefert habe also:
Code: Alles auswählen
lReg <- lm(SWF ~ log(SW), data=as.data.frame(DIA))
plot(SWF ~ log(SW), data=as.data.frame(DIA))
abline(lReg)
So, jetzt zur Entststehung der Matrix
DIA. Meine Glaskugel sagt mir, Du hast erst drei Vektoren erzeugt:
Diese drei Vektoren hast Du dann mit
cbind() zu einer Matrix zusammengeklebt:
Hast Du die Daten auf irgendeine Weise eingelesen und kannst uns zeigen wie? Dann können wir Dir zeigen, wie man diesen Teil am besten erledigt.
Aber auch schon mit den einzelnen Vektoren wäre der bessere Weg gewesen, gleich einen Dataframe zu erzeugen:
Dann entfällt in dem Code auch immer das Umwandeln mit
as.data.frame(...)
Also:
Code: Alles auswählen
lReg <- lm(SWF ~ log(SW), data=DIA)
plot(SWF ~ log(SW), data=DIA)
abline(lReg)
Gruß, Jörg
p.s.:
Bitte lies
viewtopic.php?f=20&t=29 und halte Dich bei zukünftigen Nachrichten daran.
Re: Logarithmische Regression
Verfasst: Do Aug 23, 2018 11:57 am
von RBuchi
- Rplot.png (8.1 KiB) 3550 mal betrachtet
Hallo,
so das ist mein code:
Code: Alles auswählen
Daten <- read.table("R_SWFpunkt.csv", sep = ";", dec = ".", header = TRUE, stringsAsFactors = FALSE)
SW <- Daten[,5] # Sachwert aus Spalte 5 in Vektor SW
SWF <- Daten[,7] # Sachwert aus Spalte 7 in Vektor SWF
BRW <- Daten[,6] #Bodenrichtwert aus Spalte 6 in Vektor BRW
DIA <-cbind(SW,SWF,BRW) # Verbinde W zu Matrix DIA
DIA <-DIA[BRW>160,] # Nur Werte bis Bodenrichtwert größer 160 €
plot(DIA, main = "Sachwert/Ertragswert",
ylab= "Sachwertfaktor",
xlab = "Sachwert")
abline(lm(SWF~SW),lwd=2, col="blue") # LinReg berechnen und Liie zeichnen
grid(lwd=2, col="darkgrey") # Raster zeichnen
lm(SWF ~ log(SW), data=as.data.frame(DIA))
Das Ergebnis seht ihr oben, im grossen Bild
was mir noch fehlt ist das einzeichnen der logarithmischen Funktion.
Die Parameter habe ich mit der Ausgabe von
Code: Alles auswählen
Call:
lm(formula = SWF ~ log(SW), data = as.data.frame(DIA))
Coefficients:
(Intercept) log(SW)
2.709 -0.145
Die Funktion wäre y = a * log(x) + b also y= -0.145 * log(x) + 2.709
Ich würde auch gerne auf beiden Parameter zugreifen können und die Forme in die Grafik schreiben.
Das ganze soll dann so aussehen wie im kleinen Bild.
Danke für eure Hilfe
Gruss
Bernhard
Re: Logarithmische Regression
Verfasst: Di Aug 28, 2018 1:05 pm
von jogo
RBuchi hat geschrieben: ↑Do Aug 23, 2018 11:57 am
Die Funktion wäre y = a * log(x) + b also y= -0.145 * log(x) + 2.709
Ich würde auch gerne auf beiden Parameter zugreifen können und die Forme in die Grafik schreiben.
Dafür gibt es die Funktion
coef(), also:
Du könntest aber auch die Punkte laut Modellfunktion generieren mit HIlfe von
predict()
Gruß, Jörg
Re: Logarithmische Regression
Verfasst: Mi Aug 29, 2018 11:57 am
von RBuchi
Hallo Jörg,
danke für den Tip, genau das hat mir gefehlt.
Die Kurve ist endlich da.
Code: Alles auswählen
Daten <- read.table("R_SWFpunkt.csv", sep = ";", dec = ".", header = TRUE, stringsAsFactors = FALSE)
SW <- Daten[,5] # Sachwert aus Spalte 5 in Vektor SW
SWF <- Daten[,7] # Sachwert aus Spalte 7 in Vektor SWF
BRW <- Daten[,6] #Bodenrichtwert aus Spalte 6 in Vektor BRW
DIA <-cbind(SW,SWF,BRW) # Verbinde W zu Matrix DIA
DIA <-DIA[BRW>160,] # Nur Werte bis Bodenrichtwert groesser 160
plot(DIA, main = "Vorl. Sachwert/Sachwertfaktor",
ylab= "Sachwertfaktor",
xlab = "vorl. Sachwert")
ab <-coef(lm(SWF ~ log(SW), data=as.data.frame(DIA))) # übertragen der Paramter a und b aus der Regression
b<-ab[1]
a<-ab[2]
curve(a * log(x) + b[1], 100000,500000, add=TRUE ) # Kurve der Funktion y=a*ln(x)+b zeichen
Hast du noch einen Tipp wie ich die Wissenschaftliche Schreibweise an der Achse ersetzen kann durch normale Zahlen.
Gerne auch wenn du/ihr noch Verbesserungen am Code seht.
Gruss
Bernhard
- Rplot01.png (6.95 KiB) 3506 mal betrachtet