提问人:LucyBM 提问时间:10/24/2023 最后编辑:LucyBM 更新时间:10/25/2023 访问量:35
计算特定点处 S 形曲线的梯度
Calculating the gradient of sigmoidal curve at specific point
问:
我使用 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))
}
答:
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 = input
xmid - 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.5
y = params["Asym"] / 2
params["xmid"]
上一个:我应该定义非线性模型的起始值吗?
下一个:r中的约束GAM:增加
评论
x + eps
x
x + eps
eps