Функция, которую SSlogis подгоняет, дана в справке для функции как:
Asym/(1+exp((xmid-input)/scal))
Для простоты обозначения давайте изменим input
на x
, и мы установим эту функцию равнойy
(в вашем коде fit
):
y = Asym/(1+exp((xmid - x)/scal))
Нам нужно инвертировать эту функцию, чтобы получить 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))))
Теперь мы создадим функцию для вычисления 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])