Решение (определение) функции в точке в R

В моем ниже R-коде мне было интересно, как я могу узнать, что такое rh1, когда y == 0,5?

Обратите внимание, что y использует atanh(rh1), который можно преобразовать обратно в rh1 с помощью tanh().

rh1 <- seq(-1, 0.1, by = 0.001)
y <- pnorm(-0.13, atanh(rh1), 0.2)
plot(rh1, y, type = "l")

person rnorouzian    schedule 12.01.2017    source источник


Ответы (2)


Аналитическое решение

Для нормального распределения X ~ N(mu, 0.2). Мы хотим найти mu, такое, что Pr (X < -0.13) = y.

Вспомните свой предыдущий вопрос и мой ответ там: Определите нормальное распределение с учетом его квантильной информации. Здесь у нас есть кое-что попроще, поскольку есть только один неизвестный параметр и одна квантильная информация.

Снова начнем со стандартизации:

   Pr {X < -0.13} = y
=> Pr { [(X - mu) / 0.2] < [(-0.13 - mu) / 0.2] } = y
=> Pr { Z < [(-0.13 - mu) / 0.2] } = y    # Z ~ N(0,1)
=> (-0.13 - mu) / 0.2 = qnorm (y)
=> mu = -0.13 - 0.2 * qnorm (y)

Теперь позвольте atanh(rh1) = mu => rh1 = tanh(mu), вкратце, аналитическое решение:

tanh( -0.13 - 0.2 * qnorm (y) )

Численное решение

Это проблема поиска корня. Сначала мы создаем следующую функцию f и стремимся найти ее корень, то есть rh1, чтобы f(rh1) = 0.

f <- function (rh1, y) pnorm(-0.13, atanh(rh1), 0.2) - y

Самый простой метод поиска корня - метод деления пополам, реализованный uniroot в R. Я рекомендую вам прочитать Решение Uniroot в R, чтобы узнать, как мы должен работать с ним вообще.

curve(f(x, 0.5), from = -1, to = 0.1); abline (h = 0, lty = 2)

Мы видим, что между (-0.2, 0) есть корень, поэтому:

uniroot(f, c(-0.2, 0), y = 0.5)$root
# [1] -0.129243
person Zheyuan Li    schedule 12.01.2017
comment
uniroot на самом деле делает что-то более интересное, чем деление пополам (метод Брента: «Функция использует процедуру золотого сечения в сочетании с параболической интерполяцией», из netlib.org/c/brent.shar). Не то чтобы это имело значение для этой проблемы. - person Ben Bolker; 13.01.2017

Ваша функция монотонна, поэтому вы можете просто создать обратную функцию.

rh1 <- seq(-1,.1,by=.001)
y <- pnorm(-.13,atanh(rh1),.2)

InverseFun = approxfun(y, rh1)
InverseFun(0.5)
[1] -0.1292726
person G5W    schedule 12.01.2017