Logarithmische Regression

Modelle zur Korrelations- und Regressionsanalyse

Moderator: EDi

jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag von jogo »

Hallo Bernhard,
RBuchi hat geschrieben: Mi Aug 29, 2018 11:57 am danke für den Tip, genau das hat mir gefehlt.

Die Kurve ist endlich da.
prima!
Hast du noch einen Tipp wie ich die Wissenschaftliche Schreibweise an der Achse ersetzen kann durch normale Zahlen.
ich bin leider nicht der Grafikexperte.
Gerne auch wenn du/ihr noch Verbesserungen am Code seht.
ja, das kann ich :D
Du generierst immer noch zuviel Müll nebenher; hier eine erste veränderte Version:

Code: Alles auswählen

Daten <- read.table("R_SWFpunkt.csv", sep = ";", dec = ".", header = TRUE, stringsAsFactors = FALSE)

DIA <- Daten[, c(5, 7, 9)]
names(DIA) <- c("SW", "SWF", "BRW")

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=DIA))  # übertragen der Paramter a und b aus der Regression
curve(ab[2] * log(x) + ab[1], 100000,500000, add=TRUE )     # Kurve der Funktion y=a*ln(x)+b zeichen
Da sehe ich noch, dass Du bei Daten <- ... eine Kopfzeile einliest. Kannst Du bitte mal das Ergebnis von

Code: Alles auswählen

str(Daten)
zeigen - dann gibt es von mir eine zweite Version. ;)

Gruß, Jörg
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag von RBuchi »

Code: Alles auswählen

> str(Daten)
'data.frame':	158 obs. of  12 variables:
 $ X.A..Reg..Nr.                       : num  1 11 13 21 24 30 32 34 35 41 ...
 $ X.B..Reg..Jahr                      : int  2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 ...
 $ X.C..Kaufpreis..gem..Vertrag......  : num  148000 115000 230000 255000 165000 170000 180000 124000 190000 185000 ...
 $ X.F..Kaufpreis..bereinigt.....      : num  148000 115000 240000 255000 165000 ...
 $ X.L..vorl.ufiger.Sachwert....       : num  160684 120282 302954 331684 181508 ...
 $ X.D..Wert....mý.                    : num  105 90 80 125 110 160 135 170 120 120 ...
 $ X.E..Sachwertfaktor..ki.            : num  0.92 0.96 0.79 0.77 0.91 0.9 0.86 1 0.88 0.88 ...
 $ X.G..Baujahr                        : int  1959 1960 2005 1985 2000 1982 1963 1956 1982 1983 ...
 $ X.J...fiktives..Baujahr             : int  1972 1962 2005 1985 2000 1982 1972 1956 1982 1983 ...
 $ X.H..Wohnfl.che                     : int  125 110 236 161 115 163 110 116 132 138 ...
 $ X.I..BGF..WF.NF..Herstellungskosten.: int  225 189 294 474 131 308 323 241 216 315 ...
 $ X.K..RND                            : int  35 25 68 48 63 45 35 19 45 46 ...
> 
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Logarithmische Regression

Beitrag von bigben »

RBuchi hat geschrieben: Mi Aug 29, 2018 11:57 amHast du noch einen Tipp wie ich die Wissenschaftliche Schreibweise an der Achse ersetzen kann durch normale Zahlen.
Du kannst die volle Kontrolle über die Achsenbeschriftung übernehmen und an beliebige Stellen beliebiges Schreiben. Siehe Beispiel:

Code: Alles auswählen

x <- runif(20)
y <- runif(20)
plot(x,y, xaxt="n") # das xaxt="n" sorgt für einen Plot ohne x-Achsenbeschriftung. die holen wir dann mit axis() nach
axis(side = 1, 
     at = c(.1, .3, .45, .73, .9), 
     labels = c("was", "ich", "will", "hier", "da"))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag von jogo »

ok, die Namen in der Kopfzeile sind doch ziemlich chaotisch; deshalb nur kleine Änderungen für die zweite Version:

Code: Alles auswählen

Daten <- read.table("R_SWFpunkt.csv", sep = ";", dec = ".", header = TRUE, stringsAsFactors = FALSE)
names(Daten)[c(5, 7, 9)] <- c("SW", "SWF", "BRW")

DIA <- Daten[Daten$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=DIA))  # übertragen der Paramter a und b aus der Regression
curve(ab[2] * log(x) + ab[1], 100000,500000, add=TRUE )     # Kurve der Funktion y=a*ln(x)+b zeichen
RBuchi
Beiträge: 7
Registriert: Di Aug 21, 2018 9:55 am

Re: Logarithmische Regression

Beitrag von RBuchi »

Vielen Dank,

jetzt komme ich erstmal selber weiter.

Gruss

Bernhard
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Logarithmische Regression

Beitrag von Werekorden »

Hallo,

Ich möchte diesen Thread mal wiederbeleben, da ich auch ein paar Probleme mit der halblogarithmischen Regression habe.

Ich habe folgende zwei Versionen meines Codes:

Code: Alles auswählen

Ct_Values <- c(18.68, 22.595, 33.004, 34.290, 35.369, 35.271)
    #  Copies <- c(1e-3, 1e-4, 1e-7, 5e-8, 2.5e-8, 1e-8) Darstellung als Verdünnungen
    Copies <- c(47143480, 4714348, 4714, 2357, 1179, 471) #Darstellung Kopienanzahl/ml umgerechnet aus Verdünnungen
    #----------------Regression Erstellung------------
    lReg <- lm(Ct_Values ~ log(Copies))
    lReg
    summary(lReg)
    #-------------------Plot erstellen und Trendlinie einzeichnen--------------------------
    plot (Ct_Values ~ log(Copies), main ="Regression CAP Kit", sub="Data from in House testing", pch = 19)
    abline(lReg, col ="red", untf = FALSE)

und der zweite Code sollte das gleiche Ergebnis liefert aber ein anderes:

Code: Alles auswählen

  Konz_x <- c(1e-3, 1e-4, 1e-7, 5e-8, 2.5e-8, 1e-8)
  CT_Wert_y <- c(18.68, 22.595, 33.004, 34.290, 35.369, 35.271)
  
  fm <- lm(CT_Wert_y ~ log(Konz_x))
  summary (fm)
  
  plot(Konz_x, CT_Wert_y, xlim = c(1e-9, 1e-2), ylim = c(0, 40), log = "x", xlab = "Copies", ylab = "Ct-Values", 
  main ="Linear regression CAP Kit", sub="Data from in House testing", pch = 19)
  
  abline(fm, col = "red",lwd=2, untf = FALSE)

Beim ersten Code wird die Trendlinie korrekt dargestellt und im zweiten eben nicht. Ich weiß nicht warum, hat da jemand eine Idee.
Beim ersten Code wird aber die x-Achse nicht korrekt dargestellt, was beim zweiten Code jedoch der Fall ist. Ich habe im ersten Code die Verdünnungen in Kopienanzahl umgerechnet, so würde ich es auch gerne irgendwie im Plot darstellen.

ICh suche also quasi eine Lösung / den Fehler damit ich die x-Achse des zweiten Codes mit der Trendlinie des ersten Codes gemeinsam in einem Plot erhalte.

Danke für euere Hilfe

Andreas
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag von jogo »

Hallo Andreas,
Werekorden hat geschrieben: Do Mär 28, 2019 10:14 pm

Code: Alles auswählen

  Konz_x <- c(1e-3, 1e-4, 1e-7, 5e-8, 2.5e-8, 1e-8)
  CT_Wert_y <- c(18.68, 22.595, 33.004, 34.290, 35.369, 35.271)
  
  fm <- lm(CT_Wert_y ~ log(Konz_x))
  summary (fm)
  
  plot(Konz_x, CT_Wert_y, xlim = c(1e-9, 1e-2), ylim = c(0, 40), log = "x", xlab = "Copies", ylab = "Ct-Values", 
  main ="Linear regression CAP Kit", sub="Data from in House testing", pch = 19)
  
  abline(fm, col = "red",lwd=2, untf = FALSE)
Beim ersten Code wird die Trendlinie korrekt dargestellt und im zweiten eben nicht. Ich weiß nicht warum, hat da jemand eine Idee.
die Formel im Plot entspricht nicht der Regression. Die Funktion abline() zeichnet eine Gerade entsprechend der geschätzten Parameter. Die Schätzung bezieht sich aber auf einen linearen Zusammenhang zwischen CT_Wert_y und log(Konz_x) :!:
abline() kann nicht die passende Funktion in Deinen Plot einzeichnen. Du musst curve() bemühen.

Gruß, Jörg
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Logarithmische Regression

Beitrag von Werekorden »

hallo Jörg,

vielen Danl für deine Idee.

Mich wundert halt, dass es bei der Formel fm<- lm(Ct-Values ~ log(Copies)) mit abline geht egal ob ich die Verdünnungen nehme oder die kopienzahlen, aber bei lReg<– lm(Ct-Wert ~ log(Konz)) nicht geht.

das kann doch nicht sein.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Logarithmische Regression

Beitrag von jogo »

Hallo Andreas,
Werekorden hat geschrieben: Fr Mär 29, 2019 9:53 am Mich wundert halt, dass es bei der Formel fm<- lm(Ct-Values ~ log(Copies)) mit abline geht egal ob ich die Verdünnungen nehme oder die kopienzahlen, aber bei lReg<– lm(Ct-Wert ~ log(Konz)) nicht geht.

das kann doch nicht sein.
daran liegt es auch nicht (zumindest nicht als alleinige Ursache). Sondern - jetzt wiederhole ich mich - daran, dass das Koordinatensystem des Plots zur linearen Schätzung passt bzw. eben nicht.

passt: lm(y ~ log(x)) .... plot(y ~ log(x))
passt nicht: lm(y ~ log(x)) .... plot(y ~ x)

Gruß, Jörg
Werekorden
Beiträge: 83
Registriert: So Feb 04, 2018 7:52 pm

Re: Logarithmische Regression

Beitrag von Werekorden »

Hallo Jörg,

Danke für dein Hinstoßen.

Prinzipiell habe ich es verstanden, denke ich. Wenn ich eine logarithmische Darstellung auf einer der Achsen habe kann ich keine abline Linie hinzufügen.

Das es mit dem einen Code "doch funktioniert" hat, liegt daran, dass ich zwar bei der linearen Regression lm(y ~ log(x)) den Logarithmus genutzt habe, aber nicht beim Plotten keine logarithmische x-Achse erstellt habe: plot(y ~ x)

Nach folgendem Code bekomme ich meine schönen Werte mit korrekter x-Achsenbeschriftung (logarithmisch) hin.

Code: Alles auswählen

  Konz_x <- c(47143480, 4714348, 4714, 2357, 1179, 471)
  CT_Wert_y <- c(18.68, 22.595, 33.004, 34.290, 35.369, 35.271)
  
  fm <- lm(CT_Wert_y ~ log(Konz_x))
  summary (fm)
  fm
  plot(Konz_x, CT_Wert_y, xlim = c(300, 50000000), ylim = c(0, 40), log="x", xlab = "Copies/ml patient sample", 
  ylab = "Ct-Values", main ="Linear regression CAP Kit", pch = 19)
  abline(fm, col = "red",lwd=2, untf = FALSE)

Trotzdem habe ich noch eine :oops: oder mehrere Fragen:
Ich habe mir die lineare Regressionsdaten ausgegeben lassen um die Formel für den Befehl curve zu erhalten.
Coefficients:
(Intercept) log(Konz_x)
45.531 -1.504
Jetzt habe ich die Formel wie folgt genutzt, welche aber offensichtlich falsch ist!

Code: Alles auswählen

  
  plot(Konz_x, CT_Wert_y, xlim = c(300, 50000000), ylim = c(0, 40), log="x", xlab = "Copies/ml patient sample", 
  ylab = "Ct-Values", main ="Linear regression CAP Kit", pch = 19)
  par(new=TRUE)
  curve (x*-1.504+ 45.531, 0, 40)
Die Trendlinie stimmt nicht und was auch stört ist, dass durch curve die x und y-Achsen neubeschriftet werden.

Sorry aber ich bin irgendwie noch nicht richtig warm geworden mit R. :(
Antworten