我有以下数据点:
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
其中
y_model = (ymax*xdata / (ec50 + xdata)) + Ns* xdata + ymin
return y_model - ydata
ymax = 1624.75
ymin = 91.85
ec50 = 3
最后,从以下库中调用最小化:
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
相同的行为。我尝试使用residual
和minimize
函数在 R 中搜索相应的库;但是,我无法找到任何(也没有正确使用)给我与Python相同的结果。
当我绘制residual
,xdata
以及ydata
(我上面提供的)的结果时,我会在Python中获得以下图表。最后,我只想在 R 或Excel中重现相同的图表。
如何进行?我不是Python方面的专家,因此,我无法将代码从Python正确移植到 R 或Excel。
答案 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