【问题标题】:How to find the multivariate empirical cumulative distribution function (CDF) in R?如何在 R 中找到多元经验累积分布函数 (CDF)?
【发布时间】:2019-03-19 22:43:31
【问题描述】:

我有两个相关变量 x 和 y,我想知道如何在 R 中找到它们的经验联合 CDF?

此外,我们如何找到如下概率:P(X=2 and Y>=3), P(X>=3 and Y=2); P(X=3 or Y>=2), P(X>=3 or Y=3 )?感谢您的帮助。

x= c(1,3,2,2,8,2,1,3,1,1,3,3,1,1,2,1,2,1,1,3,4,1,1,3,1,1,2,1,3,7,1,4,6,1,2,1,1,3,1,2,2,3,4,1,1,1,1,2,2,12,1,1,2,1,1,1,3,4)
y = c(1.42,5.15,2.52,2.29,12.36,2.82,1.49,3.53,1.17,1.03,4.03,5.26,1.65,1.41,3.75,1.09,3.44,1.36,1.19,4.76,5.58,1.23,2.29,7.71,1.12,1.26,2.78,1.13,3.87,15.43,1.19,4.95,7.69,1.17,3.27,1.44,1.05,3.94,1.58,2.29,2.73,3.75,6.80,1.16,1.01,1.00,1.02,2.32,2.86,22.90,1.42,1.10,2.78,1.23,1.61,1.33,3.53,10.44)

cor(x,y)
x_cdf = ecdf(x)
y_cdf = ecdf(y)

【问题讨论】:

  • 您从两个独立的正态分布中抽取样本,而不是从二元正态分布中抽取样本。我对你在问/试图做什么感到困惑。 MASS::mvnorm 允许您从二元正态中抽取样本。对于两个独立的随机变量,联合 CDF 只是各个 CDF 的乘积。
  • "x 和 y 假设来自两个相关的观察,这里我只是创建了一些假数据" 正如我解释的那样,你的假数据不是很好,也不代表您的实际问题,因为 xy 是独立的(而不是来自二元分布)。
  • @Croote 我已经尝试过emcdf 包,但是它不能像 P(X
  • 在文档中,您可以为 emcdf() 函数提供一个两列数据框,该函数返回一个用作二元 cdf 的对象。你不能用那个对象吗?
  • @Croote emcdf 函数确实返回一个对象,对象中的点基本上来自输入 x 和 y。但在我的情况下,我需要为一些不包含在 x 和 y 中的新点找到 CDF。如果您尝试使用emcdf 包解决我的问题,您会更好地理解我想说的。谢谢。

标签: r ecdf


【解决方案1】:

您可以使用mltools 包。

x <- c(1,3,2,2,8,2,1,3,1,1,3,3,1,1,2,1,2,1,1,3,4,1,1,3,1,1,2,1,3,7,1,4,6,1,2,1,1,3,1,2,2,3,4,1,1,1,1,2,2,12,1,1,2,1,1,1,3,4)
y <- c(1.42,5.15,2.52,2.29,12.36,2.82,1.49,3.53,1.17,1.03,4.03,5.26,1.65,1.41,3.75,1.09,3.44,1.36,1.19,4.76,5.58,1.23,2.29,7.71,1.12,1.26,2.78,1.13,3.87,15.43,1.19,4.95,7.69,1.17,3.27,1.44,1.05,3.94,1.58,2.29,2.73,3.75,6.80,1.16,1.01,1.00,1.02,2.32,2.86,22.90,1.42,1.10,2.78,1.23,1.61,1.33,3.53,10.44)

library(mltools)
library(data.table)

# set data in a data.table
dt <- data.table(x = x, y = y)

例如:P(X &lt;= 3, Y &lt;= 5) = ?

> empirical_cdf(dt, ubounds = data.table(x = 3, y = 5))
   x y N.cum       CDF
1: 3 5    47 0.8103448
> mean(x <= 3 & y <= 5) # same result
[1] 0.8103448

现在,假设您要计算 P(X &gt; 3, Y &lt;= 5)。从等式开始

P(X <= 3, Y <= 5) + P(X > 3, Y <= 5) = P(Y <= 5)

你得到

P(X > 3, Y <= 5) = P(Y <= 5) - P(X <= 3, Y <= 5)

然后你计算这个概率如下:

> empirical_cdf(dt$y, 5)$CDF - empirical_cdf(dt, data.table(x = 3, y = 5))$CDF
[1] 0.01724138
> mean(x > 3 & y <= 5) # same result
[1] 0.01724138

【讨论】:

  • 非常感谢您提供的出色解决方案。我知道empirical_cdf 可以计算CDF,但为什么mean(x &lt;= 3 &amp; y &lt;= 5) 也可以计算CDF?我有点困惑。谢谢。
  • 还有。我们如何计算P(X &gt;= 3, Y &lt;= 5)? (X >= 3 有一个“=”)非常感谢。