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

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/

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:

Code: Alles auswählen

lm(SWF ~ log(SW), data=as.data.frame(DIA))
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

Code: Alles auswählen

ln(x)
gibt es in R nicht. Die Funktion für den natürlichen Logarithmus heißt 'log', wie in

Code: Alles auswählen

> log(exp(1))
[1] 1
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

Code: Alles auswählen

-0.145031136
2.709245055
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.

Code: Alles auswählen

abline(lm(SWF~SW),lwd=2, col="blue")
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

Code: Alles auswählen

-0.145031136
2.709245055
passt

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")
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:

Code: Alles auswählen

SWF <- ...  ## und
SW <- ... ## und
BRW <- ...
Diese drei Vektoren hast Du dann mit cbind() zu einer Matrix zusammengeklebt:

Code: Alles auswählen

DIA <- cbind(SW, SWF, BRW)
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:

Code: Alles auswählen

DIA <- data.frame(SW=SW, SWF=SWF, BWR=BWR)
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
SoSollEsSein.JPG
Rplot.png
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

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

Verfasst: Di Aug 28, 2018 1:05 pm
von jogo
RBuchi hat geschrieben: Do Aug 23, 2018 11:57 am

Code: Alles auswählen

...
lm(SWF ~ log(SW), data=as.data.frame(DIA))
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:

Code: Alles auswählen

coef(lm(SWF ~ log(SW), data=as.data.frame(DIA)))
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
Rplot01.png (6.95 KiB) 3506 mal betrachtet