簡體   English   中英

在 r 的 S 形曲線上找到一個點

[英]finding a point on a sigmoidal curve in r

這是一個數據集:

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 型曲線上找到一個點。我該怎么做?

SSlogis 適合的 function 在 function 的幫助中給出:

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

為簡單起見,讓我們將input更改為x並將此 function 設置為等於yfit您的代碼):

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

我們需要反轉這個 function 以在 LHS 上單獨獲得x ,以便我們可以從y計算x 這樣做的代數在這個答案的末尾。

首先,讓我們 plot 你原來的配合:

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

在此處輸入圖像描述

現在,我們將創建一個 function 來根據 y 值計算 x 值。 再一次,請參閱下面的代數來生成這個 function。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM