найти точку на сигмоидальной кривой в г - PullRequest
4 голосов
/ 17 октября 2019

Вот набор данных:

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

До сих пор я знаю, как подогнать сигмоидальную кривую и отобразить ее на экране:

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

Теперь я хочу найтиточка на сигмоидальной кривой, когда у = 50. Как мне это сделать?

1 Ответ

4 голосов
/ 17 октября 2019

Функция, которую 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))))

enter image description here

Теперь мы создадим функцию для вычисления 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])
...