【问题标题】:finding a point on a sigmoidal curve in r在 r 中的 S 形曲线上找到一个点
【发布时间】:2020-02-13 20:34:28
【问题描述】:

这是一个数据集:

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

到目前为止,我知道如何拟合 sigmoidal 曲线并将其显示在屏幕上:

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))))

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

【问题讨论】:

  • “我现在想在 y = 50 时在 S 形曲线上找到一个点”。也许我误解了,但这不正是xmid 的估计值吗?这是x 的值,其中 sigmoidal 响应为最大值的 50%。
  • 我可能遗漏了一些东西,但 xmid = -38.10,如果我在视觉上估计 y = 50 时的 x 值,它似乎在 +5 左右。
  • @MauritsEvers - 好点。但是,y = 50,与 Asym 的 50% 不同。因为 Asym 的拟合值可能不完全是 100。
  • @dww 啊,我明白了。我假设响应是正常化的。

标签: r regression curve-fitting non-linear-regression sigmoid


【解决方案1】:

SSlogis适合的函数在函数帮助中给出如下:

Asym/(1+exp((xmid-input)/scal))

为简单起见,让我们将input 更改为x,并将此函数设置为等于y(在您的代码中为fit):

y = Asym/(1+exp((xmid - x)/scal))

我们需要反转此函数以在 LHS 上单独获得 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))))

现在,我们将创建一个函数来根据 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)

通过代数工作,让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])

【讨论】:

  • 完美运行 - 也有精彩的解释。感谢您的帮助。
  • 因答案的卓越和清晰而受到支持。
猜你喜欢
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 2018-10-02
  • 2016-01-07
  • 2019-12-16
  • 2020-07-07
  • 2013-12-31
  • 2021-04-02
相关资源
最近更新 更多