大佬教程收集整理的这篇文章主要介绍了R 求解方程 - uniroot 中的误差(f,x = 2.326348,lower = 0.1,upper = 1e+08),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在 R 中解决以下等式:
@R_607_10814@6348 = normal inverse function(y)
@H_673_6@
正态反函数是:
sqrt(-2*log(sqrt(2*pi)*y))
@H_673_6@
或者更简单:qnorm(y)@H_673_6@
所以为了求解方程,我使用了下面的函数:
f <- function(x,y) (sqrt(-2*log(sqrt(2*pi)*y))-X)
uniroot(f,x=@R_607_10814@6348,lower=0.1,upper=100000000)$root
@H_673_6@
或
f <- function(x,y) (qnorm(y)-X)
uniroot(f,upper=100000000)$root
@H_673_6@
但这确实返回:
Error in uniroot(f,x = @R_607_10814@6348,lower = 0.1,upper = 1e+08) :
f.upper = f(upper) is NA
@H_673_6@
我该怎么做才能解这个方程?我已经saw this,但似乎不是同一个问题。
uniroot documentation
这个问题在下面提到了 f 和 g,好像它们是一样的,但实际上它们不是。固定 x 时 f(x,y) = 0 的解是 y = dnorm(X),固定 x 时 g(x,y) = 0 的解是 y = pnorm(X)。 f 函数体中 -x 左侧的表达式是高斯概率密度函数 (pdf) 的倒数,而 g 中的表达式是高斯累积概率分布函数 (cdf) 的倒数。
f <- function(x,y) (sqrt(-2*log(sqrt(2*pi)*y))-X)
g <- function(x,y) qnorm(y) - x
x <- @R_607_10814@6348
f(x,dnorm(X))
## [1] 0
g(x,pnorm(X))
## [1] 4.440892e-16
@H_673_6@
首先我们使用上面的 f。
两边都平方,然后它会在 uniroot 中表现得更好。也使用 0 和 1 作为边界。
x <- @R_607_10814@6348
f2 <- function(x,y) -2*log(sqrt(2*pi)*y)-x^2
result <- uniroot(f2,x = x,lower = 0,upper = 1)
result
## $root
## [1] 0.02666295
##
## $f.root
## [1] -0.000811161
##
## $iter
## [1] 9
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
@H_673_6@
比较上面的根与
dnorm(X)
## [1] 0.02665213
@H_673_6@
现在我们使用上面的 g。
result2 <- uniroot(g,upper = 1)
result2
## $root
## [1] 0.99001
##
## $f.root
## [1] 0.0003750975
##
## $iter
## [1] 11
##
## $init.it
## [1] NA
##
## $estim.prec
## [1] 6.103516e-05
@H_673_6@
比较上面的根和 pnorm(X)
pnorm(X)
## [1] 0.99
@H_673_6@
,
qnorm@H_673_6@ 的定义区间是
[0,1]@H_673_6@ 并且您收到错误,因为您试图在此区间之外找到解决方案。
如果您将搜索限制为 [0,1]@H_673_6@,它会起作用:
y = @R_607_10814@6348
uniroot(function(X) qnorm(X)-y,lower=0,upper = 1)
#> $root
#> [1] 0.99001
#>
#> $f.root
#> [1] 0.0003750975
#>
#> $iter
#> [1] 11
#>
#> $init.it
#> [1] NA
#>
#> $estim.prec
#> [1] 6.103516e-05
@H_673_6@
以上是大佬教程为你收集整理的R 求解方程 - uniroot 中的误差(f,x = 2.326348,lower = 0.1,upper = 1e+08)全部内容,希望文章能够帮你解决R 求解方程 - uniroot 中的误差(f,x = 2.326348,lower = 0.1,upper = 1e+08)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。