Logarithmische Regression
Moderator: EDi
Logarithmische Regression
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
Code: Alles auswählen
str(DIA)
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/
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Logarithmische Regression
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
willkommen im Forum!
Suchst Du die Werte für die Parameter a und b
Das sieht nach einer Matrix aus. Es wäre besser, wenn es ein Dataframe wäre.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
Es könnte so aussehen:Kann mir jemand mit einem einfachen Beispiel helfen ?
Code: Alles auswählen
lm(SWF ~ log(SW), data=as.data.frame(DIA))
Code: Alles auswählen
lReg <- lm(SWF ~ log(SW), data=as.data.frame(DIA))
summary(lReg)
Code: Alles auswählen
lR <- lm(Petal.Length ~ log(Sepal.Length), data=iris)
plot(Petal.Length ~ log(Sepal.Length), data=iris)
abline(lR)
Re: Logarithmische Regression
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
Code: Alles auswählen
ln(x)
Code: Alles auswählen
> log(exp(1))
[1] 1
Bernhard
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Logarithmische Regression
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"
>
Code: Alles auswählen
lm(SWF ~ log(SW), data=as.data.frame(DIA))
Coefficients:
(Intercept) log(SW)
2.709 -0.145
Code: Alles auswählen
-0.145031136
2.709245055
Würde diese Funktion auch gerne plotten.
Mit einer linearen Regression hab ich es hinbekommen.
Code: Alles auswählen
abline(lm(SWF~SW),lwd=2, col="blue")
Danke
Gruss
Bernhard
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
Re: Logarithmische Regression
jawohl, es ist eine Matrix. ... und unten offenbart sich auch, wie Du sie zusammengestöpselt hast; dort dann noch entsprechende Anmerkungen.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" >
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
Code: Alles auswählen
-0.145031136
2.709245055
Du kannst nach dem Beispiel mit den iris-Daten vorgehen, das ich Dir geliefert habe also:Würde diese Funktion auch gerne plotten.
Mit einer linearen Regression hab ich es hinbekommen.
Code: Alles auswählen
abline(lm(SWF~SW),lwd=2, col="blue")
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)
Code: Alles auswählen
SWF <- ... ## und
SW <- ... ## und
BRW <- ...
Code: Alles auswählen
DIA <- cbind(SW, SWF, BRW)
Aber auch schon mit den einzelnen Vektoren wäre der bessere Weg gewesen, gleich einen Dataframe zu erzeugen:
Code: Alles auswählen
DIA <- data.frame(SW=SW, SWF=SWF, BWR=BWR)
Also:
Code: Alles auswählen
lReg <- lm(SWF ~ log(SW), data=DIA)
plot(SWF ~ log(SW), data=DIA)
abline(lReg)
p.s.:
Bitte lies viewtopic.php?f=20&t=29 und halte Dich bei zukünftigen Nachrichten daran.
Re: Logarithmische Regression
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
lm(SWF ~ log(SW), data=as.data.frame(DIA))
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
Dafür gibt es die Funktion coef(), also:RBuchi hat geschrieben: ↑Do Aug 23, 2018 11:57 amDie Funktion wäre y = a * log(x) + b also y= -0.145 * log(x) + 2.709Code: Alles auswählen
... lm(SWF ~ log(SW), data=as.data.frame(DIA))
Ich würde auch gerne auf beiden Parameter zugreifen können und die Forme in die Grafik schreiben.
Code: Alles auswählen
coef(lm(SWF ~ log(SW), data=as.data.frame(DIA)))
Gruß, Jörg
Re: Logarithmische Regression
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