2017-02-18 10 views
0

Ich habe folgende Datenpunkte:Mimic minimieren Funktion von Python in R

xdata wie folgt aussieht.

1000.00 
300.00 
100.00 
30.00 
10.00 
3.00 
1.00 
0.30 
0.10 
0.03 
0.01 
0.00 

ydata sieht wie folgt aus.

91.8 
95.3 
100 
123 
203 
620 
1210 
1520 
1510 
1520 
1590 
1620 

Ich verwende die folgenden Befehle in Python:

results = minimize(fit.dataFit,cParams,args=(xdata,np.array(ydata))) 
curve = np.array(ydata)+results.residual 
Std = [list(i) for i in zip(xdata,ydata, curve)] 

Mein Hauptproblem ist nicht in der Lage, den Strom von Änderungen an den Daten zu verfolgen. dataFit tut die folgende Operation:

y_model = (ymax*xdata/(ec50 + xdata)) + Ns* xdata + ymin return y_model - ydata

wo

  1. ymax = 1624.75
  2. ymin = 91.85
  3. ec50 = 3
  4. Ns = 0.2045514

Schließlich minimieren wird aus der folgenden Bibliothek aufgerufen wird:

from lmfit import minimize,Minimizer,Parameters,Parameter,report_errors,report_fit

Die Ergebnisse, die ich für Std in Python zu bekommen sind:

110 
49.1 
52.4 
121 
299 
688 
1110 
1420 
1550 
1590 
1610 
1620 

Ich versuche, die gleichen Ergebnisse in zu replizieren R oder in Excel. Beides wird ausreichen. Das Problem, das ich habe, ist, dass ich das gleiche Verhalten wie das minimize (das die kleinsten Quadrate minimiert) und residual nicht genau nachahmen kann. Ich habe versucht, nach entsprechenden Bibliotheken in R mit der minimize und residual Funktion zu suchen; Ich konnte jedoch keine finden (und sie auch nicht korrekt verwenden), die mir die gleichen Ergebnisse wie in Python gaben.

Wenn ich xdata, ydata, und die Ergebnisse von minimize (die ich oben zur Verfügung gestellt habe) grafisch darstellen, bekomme ich das folgende Diagramm in Python. Letztendlich möchte ich nur diese Grafik in R oder Excel reproduzieren. enter image description here

So gehen Sie vor? Ich bin kein Experte in Python, daher bin ich nicht in der Lage, den Code von Python zu R oder Excel korrekt zu portieren.

+0

Überprüfen Sie die Funktion 'nls' in R – gfgm

+0

Hallo @ gabriel-f-Geisler-mesevage aus, entschuldige ich mich! Ich stehe korrigiert und entferne meine falsche Annahme. Wie Sie vermuten, sind die aufgelisteten Elemente die anfänglichen Parameterwerte für die Fit-Funktion. – RanonKahn

Antwort

1

Sie können dies in R mit der Funktion nls() replizieren. Zuerst stellte ich Ihre Daten so kann es in R. gelesen wird

## Replicate results from Python `minimize` with R `nls()` 
# First I load your data in 
df <- data.frame(xdata = c(1000.00,300.00,100.00,30.00,10.00,3.00,1.00,0.30, 
          0.10,0.03,0.01,0.00), 
       ydata = c(91.8,95.3,100,123,203,620,1210,1520,1510,1520,1590, 
          1620)) 

# Now we estimate the model via nonlinear least squares 
nls.fit <- nls(ydata ~ (ymax*xdata/(ec50 + xdata)) + Ns*xdata + ymin, data=df, 
    start=list(ymax=1624.75, ymin = 91.85, ec50 = 3, Ns = 0.2045514)) 

ich Ihren Startwert für die Parameter, obwohl diese nicht die Werte, die das Modell auf absetzt. Um die Parameter nls.fit in der Konsole anzuzeigen, zeigt R Informationen über das angepasste Modell an.

df$nls.pred <- fitted(nls.fit) # We extract the predicted values of the model 
head(df) # We can examine the values of `xdata`, `ydata` and our predictions 

    xdata ydata nls.pred 
1 1000 91.8 109.48985 
2 300 95.3 49.02029 
3 100 100.0 52.29715 
4 30 123.0 120.61060 
5 10 203.0 298.55367 
6  3 620.0 687.63743 

# We can see that the values we have obtained are very close to 
# what you obtained in the variable you named Std in python. 

# I now load the ggplot2 library to recreate your plot 
library(ggplot2) 
ggplot(df, aes(xdata, ydata))+geom_point(color='red')+ 
    geom_line(data=df, aes(xdata, nls.pred))+ 
    theme_classic()+ # This makes the background black and white as in your plot 
    scale_x_log10() # The axis in your post is logged 

+0

Liebe @Gabriel F Geisler Mesevage, ich bin dankbar für Ihre ausführliche Antwort. Es half mir bei der Erstellung einer interaktiven Std-Kurve, die die R Shiny App für meinen Forschungszweck zeichnete. . Ich habe eine globale Frage zur Kurvenanpassung als nächsten Schritt zur oben erwähnten Abfrage gepostet. http://StackOverflow.com/Questions/42465934/dose-response-global-curve-fitting-using-r Können Sie mir bitte beraten, wie Sie das Problem beheben und die Kurven planen? - Vielen Dank! – RanonKahn