计算特定点处 S 形曲线的梯度

Calculating the gradient of sigmoidal curve at specific point

提问人:LucyBM 提问时间:10/24/2023 最后编辑:LucyBM 更新时间:10/25/2023 访问量:35

问:

我使用 nls 将 S 形曲线拟合到我的数据中,以计算 y=0.5 时 x 的值 - 我得到的 x 值看起来是正确的。此时我也想要梯度,所以计算导数为:我的 y 值在 0-1 之间,但我得到的梯度值非常陡峭,高达 ~3.5,所以我的导数公式不正确吗?目视检查表明梯度应为 ~0.05。 用于将模型拟合到 for 循环中的多个 Species 的完整代码:grad<-params["scal"]*exp((x-params["xmid"])/params["scal"])/(1+exp((x-params["xmid"])/params["scal"]))^2

results<-data.frame()
#iterate through each Species
Sps<-unique(data$Species)
for (sp in Sps) {
  #subset data for current Species
  subset_data<-filter(data, Species==sp)
  #fit sigmoidal logistic curve for current Species
  model<-nls(Y~SSlogis(X, Asym, xmid, scal), data=subset_data)
  #extract parameters for current Species
  params<-coef(model)
  #calculate x when y=0.5 for current Species
  x_when_y_0.5<-params["xmid"]+params["scal"]*log(0.5/(params["Asym"]-0.5))
  #calculate gradient (derivative) when y=0.5 for current Species
  grad_when_y_0.5<-params["scal"]*exp((bbday-params["xmid"])/params["scal"])/(1+exp((bbday-params["xmid"])/params["scal"]))^2
  #store results in dataframe
  results<-rbind(results, data.frame(Species=sp, X=x_when_y_0.5, Grad=grad_when_y_0.5))
}
  
R 梯度 导数 NLS

评论

1赞 Gregor Thomas 10/24/2023
绘制 S 形曲线的方法有很多种。如果您想知道您的导数是否正确,请发布方程式。
2赞 Gregor Thomas 10/24/2023
作为健全性检查,您可以手动估计导数。找到 y = 0.5 时的 x 值并验证该结果,然后和该 x 的小 epsilon,计算 处的 y 值,然后计算 和 之间的斜率。如果很小,则应接近梯度的值。x + epsxx + epseps
0赞 LucyBM 10/24/2023
是的,我的代码中的数字比我通过查看图和对 y 进行一些粗略更改/x 计算的变化应该得到的数字大近 10 倍。已更新完整代码。

答:

0赞 Gregor Thomas 10/25/2023 #1

SSlogis(根据其文档)使用表达式

## Logistic curve
Asym/(1+exp((xmid-input)/scal))

Wolfram Alpha 为我们提供了关于 as 的导数input

## Derivative of logistic curve:
Asym * exp((xmid - input) / scal) / (scal * (exp((xmid - input) / scal) + 1)^2)

这条曲线的中点是 ,所以很好地简化了这个表达式:xmid = inputxmid - input = 0

## Derivative at midpoint:
Asym * exp(0) / (scal * (exp(0) + 1)^2)

## Derivative at midpoint:
Asym / (4 * scal)

所以我建议

grad_at_midpoint = params["Asym"] / 4 / params["scal"]

请注意,除非渐近线的拟合值为 1,否则中点将不对应于 。中点将是 .中点的 x 值将为 。y = 0.5y = params["Asym"] / 2params["xmid"]