Logarithmische Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Logarithmische Regression

Beitrag 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 ?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Logarithmische Regression

Beitrag 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/
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Logarithmische Regression

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag 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
Zuletzt geändert von jogo am Di Aug 21, 2018 3:53 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert. http://forum.r-statistik.de/viewtopic.php?f=20&t=29
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag 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.
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag von RBuchi »

SoSollEsSein.JPG
Rplot.png
Rplot.png (8.1 KiB) 3510 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
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag 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
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag 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) 3466 mal betrachtet
Antworten