2017-10-17 1 views
0

Ich habe einige Daten, wo ich möchte ein nichtlineares Modell zu jeder Teilmenge der Daten mit nls passen, dann überlagern Sie die angepasste Modelle auf eine Grafik der Datenpunkte mit ggplot2. Speziell das Modell hat die FormWie die Ausgabe von einem nls Modell in ggplot2 plotten

y~V*x/(K+x) 

die Sie als Michaelis-Menten erkennen können. Eine Möglichkeit, dies zu tun, ist die Verwendung von geom_smooth, aber wenn ich geom_smooth verwende, habe ich keine Möglichkeit, die Koeffizienten für die Anpassung des Modells abzurufen. Alternativ könnte ich die Daten mit nls anpassen und dann Linien zeichnen, die mit geom_smooth angepasst wurden, aber woher weiß ich dann, dass die geom_smooth geplotteten Kurven die gleichen sind wie die von nls angepassten? Ich kann die Koeffizienten nicht von meinem nls fit zu geom_smooth übergeben und sage ihm, sie zu verwenden, es sei denn, ich kann geom_smooth nur eine Teilmenge der Daten verwenden, dann kann ich die Startparameter angeben, damit das funktioniert, aber ... Every Zeit, die ich habe versucht, dass ich einen Fehler beim Lesen erhalten wie folgt:

Aesthetics must be either length 1 or the same as the data (8): x, y, colour 

Hier einige Beispiel-made-up-Daten ich habe mit:

Concentration <- c(500.0,250.0,100.0,62.5,50.0,25.0,12.5,5.0, 
        500.0,250.0,100.0,62.5,50.0,25.0,12.5,5.0) 

drug <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2) 

rate <- c(1.889220,1.426500,0.864720,0.662210,0.564340,0.343140,0.181120,0.077170, 
      3.995055,3.011800,1.824505,1.397237,1.190078,0.723637,0.381865,0.162771) 

file<-data.frame(Concentration,drug,rate) 

wo Konzentration wird x in meinem Grundstück und bewerten wird y sein; Droge wird die Farbvariable sein. Wenn ich folgendes schreibe, bekomme ich den folgenden Fehler:

wobei models [[]] eine Liste der Modellparameter ist, die von nls zurückgegeben werden.

Irgendwelche Ideen darüber, wie ich einen Datenrahmen in geom_smooth unterteilen kann, so dass ich Kurven mit Startparametern aus meiner nls passen kann?

+1

Mögliche Duplikat [ggplot2 Plot-Funktion mit mehreren Argumenten] (https: // stackoverflow.com/questions/42598375/ggplot2-plot-function-with-several-arguments) –

+1

Nicht verwandt, aber 'plot',' file' als Variablennamen ist keine gute Idee (Funktionen existieren mit diesen Namen). – neilfws

+1

Außerdem: Es würde helfen, den Code zu sehen, der 'Modelle' generiert hat. – neilfws

Antwort

1

Die ideale Lösung würde die Ergebnisse von nls() mit ggplot plotten, aber hier ist eine "schnelle und schmutzige" Lösung basierend auf ein paar Beobachtungen.

Zuerst können Sie sicher sein, dass Sie die gleichen Koeffizienten erhalten, wenn Sie die gleiche Formel für nls() und geom_smooth(method = "nls") verwenden. Das ist, weil letzterer das erstere anruft.

Zweitens konvergiert nls() mit Ihren Beispieldaten zu den gleichen Werten von Vmax und Km (für jedes Medikament unterschiedlich), unabhängig vom Startwert. Mit anderen Worten, es ist nicht notwendig, Modelle zu erstellen, die Startwerte im Bereich für jedes einzelne Medikament verwenden. Jede der folgenden das gleiche Ergebnis für Arzneimittel 1 (und in ähnlicher Weise für Arzneimittel 2): ​​

library(dplyr) 
# use maximum as start 
df1 %>% 
    filter(drug == 1) %>% 
    nls(rate ~ Vm * Concentration/(K + Concentration), 
     data = ., 
     start = list(K = max(.$Concentration), Vm = max(.$rate))) 

# use minimum as start 
df1 %>% 
    filter(drug == 1) %>% 
    nls(rate ~ Vm * Concentration/(K + Concentration), 
     data = ., 
     start = list(K = min(.$Concentration), Vm = min(.$rate))) 

# use arbitrary values as start 
df1 %>% 
    filter(drug == 1) %>% 
    nls(rate ~ Vm * Concentration/(K + Concentration), 
     data = ., 
     start = list(K = 50, Vm = 2)) 

So ist der schnellste Weg, um die Kurven zu zeichnen einfach ist das Medikament zu einer ggplot Ästhetik, wie Farbe abzubilden. Dies erstellt separate nls Kurven aus den gleichen Startwerten und Sie können dann zurück zu nls() gehen, falls erforderlich, um die Koeffizienten zu erhalten, in dem Wissen, dass die Modelle die gleiche wie die Grafik sein sollten.

Arbeiten mit Beispieldaten file (es aber nicht file nennen, habe ich df1):

library(ggplot2) 
df1 <- structure(list(Concentration = c(500, 250, 100, 62.5, 50, 25, 12.5, 5, 
             500, 250, 100, 62.5, 50, 25, 12.5, 5), 
         drug = c(1, 1, 1, 1, 1, 1, 1, 1, 
           2, 2, 2, 2, 2, 2, 2, 2), 
         rate = c(1.88922, 1.4265, 0.86472, 0.66221, 0.56434, 0.34314, 
           0.18112, 0.07717, 3.995055, 3.0118, 1.824505, 1.397237, 
           1.190078, 0.723637, 0.381865, 0.162771)), 
         .Names = c("Concentration", "drug", "rate"), 
         row.names = c(NA, -16L), 
         class = "data.frame") 

# could use e.g. Km = min(df1$Concentration) for start 
# but here we use arbitrary values 
ggplot(df1, aes(Concentration, rate)) + 
    geom_point() + 
    geom_smooth(method = "nls", 
       method.args = list(formula = y ~ Vmax * x/(Km + x), 
           start = list(Km = 50, Vmax = 2)), 
       data = df1, 
       se = FALSE, 
       aes(color = factor(drug))) 

enter image description here

+0

Vielen Dank! das ist perfekt. Entschuldigung für die Fehler in meinem Code oben – HappyDog