在R语言中找到S形曲线上的一个点

5

以下是一组数据:

df <- data.frame('y' = c(81,67,54,49,41,25), 'x' =c(-50,-30,-10,10,30,50))

到目前为止,我知道如何拟合一个S形曲线并在屏幕上显示它:

plot(df$y ~ df$x)
fit <- nls(y ~ SSlogis(x, Asym, xmid, scal), data = df)
summary(fit)
lines(seq(-100, 100, length.out = 100),predict(fit, newdata = data.frame(x = seq(-100,100, length.out = 100))))

我现在想要找到S型曲线上y=50的点。我该怎么做?


我现在想找到S型曲线上当y=50时的点。也许我误解了,但xmid估计不就是给出这个值吗?这是S型响应达到最大值50%的x值。 - Maurits Evers
我可能漏掉了什么,但是 xmid = -38.10,如果我在 y = 50 时目测 x 值,它看起来大约为 +5。 - B C
@MauritsEvers - 很好的观点。但是,y = 50,并不等同于Asym的50%。因为Asym的拟合值很可能并不完全是100。 - dww
@dww 哦,我明白了。我曾假定响应被标准化了。 - Maurits Evers
1个回答

6

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

现在,我们将创建一个函数来计算从y值得到的x值。再次查看下面的代数式以生成此函数。
# y is vector of y-values for which we want the x-values
# p is the vector of 3 parameters (coefficients) from the model fit
x.from.y = function(y, p) {
  -(log(p[1]/y - 1) * p[3] - p[2])
}

# Run the function
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
# Add points to the plot to show we've calculated them correctly
points(x.from.y(y.vec, coef(fit)), y.vec, col="red", pch=16, cex=2)

enter image description here

通过代数运算使得 x 单独出现在左侧。请注意,在下面的代码中,p[1]=Asym,p[2]=xmid,p[3]=scal(由SSlogis计算的三个参数)。
# Function fit by 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])

3
表现完美,解释也非常好。感谢您的帮助。 - B C
1
因为回答的卓越和清晰,我点了赞。 - James Phillips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接