You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言二元正态分布数值积分求解满足概率条件的t1=t2阈值

求解步骤和代码实现

因为约束为t1=t2,我们直接令公共值为t,将问题转化为单变量求根问题:找到t使得 P(X1>t) + P(X1<t, X2>t) = 0.05,具体实现如下:

1. 依赖包准备

我们需要用到mvtnorm包计算二元正态分布的联合概率,先安装加载:

# 安装包(仅需运行一次)
install.packages("mvtnorm")
# 加载包
library(mvtnorm)

2. 定义参数和目标函数

# 定义分布参数
mu <- c(0, 0)
cov_mat <- matrix(c(1, 1/2, 1/2, 1), nrow = 2)

# 定义目标函数:输入t,返回概率和与0.05的差值
target_fun <- function(t) {
  # 计算P(X1 > t)
  p1 <- 1 - pnorm(t, mean = 0, sd = 1)
  # 计算P(X1 < t, X2 > t)
  p2 <- pmvnorm(
    lower = c(-Inf, t),
    upper = c(t, Inf),
    mean = mu,
    sigma = cov_mat
  )
  # 返回差值,求根时要让这个值等于0
  return(p1 + p2 - 0.05)
}

3. 单变量求根求解t

用R内置的uniroot函数在合理区间内求根,这里我们选区间c(1, 3)(常规单变量0.05上侧分位数约1.64,加入第二项后t会更大,区间覆盖合理范围即可):

# 求根
solve_res <- uniroot(target_fun, interval = c(1, 3))
# 输出求解得到的t值(即t1=t2的取值)
t_result <- solve_res$root
print(t_result)

结果验证

可以代入计算验证结果是否符合要求:

# 验证概率和
p1_test <- 1 - pnorm(t_result)
p2_test <- pmvnorm(lower = c(-Inf, t_result), upper = c(t_result, Inf), mean = mu, sigma = cov_mat)
cat("概率和为:", p1_test + p2_test, "\n")

正常运行后得到的t约为1.8,代入计算的概率和会非常接近0.05。

内容的提问来源于stack exchange,提问作者william zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:24:05