在R中的某个点求解(确定)函数

时间:2017-01-12 22:28:44

标签: r function statistics normal-distribution

在我的下面的R代码中,我想知道当 y == 0.5 时我怎么能找到 rh1 的内容?

请注意 y 使用atanh(rh1),可以使用tanh()将其转换回 rh1

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

2 个答案:

答案 0 :(得分:4)

分析解决方案

正常分发X ~ N(mu, 0.2)。我们希望找到mu,例如Pr (X < -0.13) = y

回想一下你之前的问题和我在那里的答案:Determine a normal distribution given its quantile information。这里我们有一些更简单的东西,因为只有一个未知参数和一个分位数信息。

同样,我们从标准化开始:

   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

最简单的根发现方法是二分法,由R中的uniroot实现。我建议你阅读Uniroot solution in 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

答案 1 :(得分:3)

您的功能是单调的,因此您可以创建反函数。

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

InverseFun = approxfun(y, rh1)
InverseFun(0.5)
[1] -0.1292726