B C*_*B C 5 regression r curve-fitting non-linear-regression sigmoid
这是一个数据集:
df <- data.frame('y' = c(81,67,54,49,41,25), 'x' =c(-50,-30,-10,10,30,50))
Run Code Online (Sandbox Code Playgroud)
到目前为止,我知道如何拟合 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))))
Run Code Online (Sandbox Code Playgroud)
我现在想在 y = 50 时在 sigmoidal 曲线上找到一个点。我该怎么做?
SSlogis 拟合的函数在函数的帮助中给出为:
Asym/(1+exp((xmid-input)/scal))
Run Code Online (Sandbox Code Playgroud)
为简单起见,让我们更改input为x,并将此函数设置为等于y(fit在您的代码中):
y = Asym/(1+exp((xmid - x)/scal))
Run Code Online (Sandbox Code Playgroud)
我们需要反转这个函数来x单独处理 LHS,以便我们可以x从计算y。这样做的代数在这个答案的末尾。
首先,让我们绘制您的原始拟合:
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))))
Run Code Online (Sandbox Code Playgroud)
现在,我们将创建一个函数来从 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)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
学习代数,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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |