模仿最小化来自R的Python中的函数

时间:2017-02-18 09:02:38

标签: python r excel graph least-squares

我有以下数据点:

max-height如下所示。

xdata

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

我在python中运行以下命令:

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

我的主要问题是无法跟踪数据的更改流。 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)] 执行以下操作:

dataFit

其中

  1. y_model = (ymax*xdata / (ec50 + xdata)) + Ns* xdata + ymin return y_model - ydata
  2. ymax = 1624.75
  3. ymin = 91.85
  4. ec50 = 3
  5. 最后,从以下库中调用最小化:

    Ns = 0.2045514

    我在python中获得from lmfit import minimize,Minimizer,Parameters,Parameter,report_errors,report_fit的结果是:

    Std

    我试图在 R 或Excel中复制相同的结果。任何一个都足够了。我遇到的问题是我无法准确地模仿与110 49.1 52.4 121 299 688 1110 1420 1550 1590 1610 1620 (最小化最小二乘)和minimize相同的行为。我尝试使用residualminimize函数在 R 中搜索相应的库;但是,我无法找到任何(也没有正确使用)给我与Python相同的结果。

    当我绘制residualxdata以及ydata(我上面提供的)的结果时,我会在Python中获得以下图表。最后,我只想在 R 或Excel中重现相同的图表。 enter image description here

    如何进行?我不是Python方面的专家,因此,我无法将代码从Python正确移植到 R 或Excel。

1 个答案:

答案 0 :(得分:1)

您可以使用函数nls()在R中复制此内容。首先,我设置了数据,以便将其读入R。

## 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))

我使用参数的起始值,尽管这些不是模型所依据的值。要在控制台中查看参数类型nls.fit,R将显示有关拟合模型的信息。

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