SSlogis拟合的函数在函数的帮助文档中给出,如下:
Asym/(1+exp((xmid-input)/scal))
为了简化表示法,让我们将
input
更改为
x
,并将此函数设置为
y
(即您代码中的
fit
):
y = Asym/(1+exp((xmid - x)/scal))
我们需要反转这个函数,将
x
独立在左侧,以便我们可以从
y
计算出
x
。完成这个任务所需的代数运算在本答案的末尾给出。
首先,让我们绘制您的原始拟合图:
plot(df$y ~ df$x, xlim=c(-100,100), ylim=c(0,120))
fit <- nls(y ~ SSlogis(x, Asym, xmid, scal), data = df)
lines(seq(-100, 100, length.out = 100),predict(fit, newdata = data.frame(x = seq(-100,100, length.out = 100))))
![enter image description here](https://istack.dev59.com/2roRq.webp)
现在,我们将创建一个函数来计算从y值得到的x值。再次查看下面的代数式以生成此函数。
x.from.y = function(y, p) {
-(log(p[1]/y - 1) * p[3] - p[2])
}
y.vec = c(25,50,75)
setNames(x.from.y(y.vec, coef(fit)), y.vec)
25 50 75
61.115060 2.903734 -41.628799
points(x.from.y(y.vec, coef(fit)), y.vec, col="red", pch=16, cex=2)
![enter image description here](https://istack.dev59.com/LjPoI.webp)
通过代数运算使得
x
单独出现在左侧。请注意,在下面的代码中,p[1]=Asym,p[2]=xmid,p[3]=scal(由
SSlogis
计算的三个参数)。
y = p[1] / (1 + exp((p[2] - x)/p[3]))
1 + exp((p[2] - x)/p[3]) = p[1]/y
exp((p[2] - x)/p[3]) = p[1]/y - 1
log(exp((p[2] - x)/p[3])) = log(p[1]/y - 1)
(p[2] - x)/p[3] = log(p[1]/y - 1)
x = -(log(p[1]/y - 1) * p[3] - p[2])
xmid
估计不就是给出这个值吗?这是S型响应达到最大值50%的x
值。 - Maurits Evers