在R语言中使用optimize/uniroot求解正态分布方程的X值
求解正态分布CDF方程的正确方法
你的代码失败的核心原因是:定义的函数f返回的是逻辑值(TRUE/FALSE),而uniroot和optimize都需要输入返回数值的函数——uniroot要找函数零点(需区间两端函数值符号相反),optimize要找函数极值,逻辑值无法满足这些要求。
下面提供三种正确的求解方式:
方法一:直接用反函数qnorm(最简便)
因为正态分布的累积分布函数pnorm是严格单调递增的,存在反函数qnorm。原方程可变形为:pnorm(x) = y + pnorm(0)
直接代入反函数即可得到解:
y <- 0.07925971 x <- qnorm(y + pnorm(0)) x # 输出约为0.2 # 验证结果 pnorm(x) - pnorm(0) == y # 返回TRUE
方法二:用uniroot找零点
构造差值函数(将等式转化为求零点问题):
g <- function(x, y = 0.07925971) { pnorm(x) - pnorm(0) - y } # 在区间[-4,4]内找零点 result <- uniroot(g, interval = c(-4, 4)) result$root # 输出约为0.2 # 验证 g(result$root) # 输出接近0
方法三:用optimize找残差平方最小值
通过最小化残差平方的方式求解,适合更复杂的非线性方程:
h <- function(x, y = 0.07925971) { (pnorm(x) - pnorm(0) - y)^2 } # 在区间[-4,4]内找最小值点 opt_result <- optimize(h, interval = c(-4, 4)) opt_result$minimum # 输出约为0.2
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

