如何在Python和/或R中获得3个或更多连续随机变量的卷积,以获得随机变量的平均值

hc8w905p  于 2022-12-24  发布在  Python
关注(0)|答案(2)|浏览(168)

假设我有三个随机变量,我想做一个卷积来得到平均值,我该如何在Python和/或R中做呢?

编辑1

另外,默认的行为似乎是卷积的大小大于任何输入,我假设所有的输入都是相同的大小,是否有可能使卷积的结果与作为卷积输入的向量大小相同?
例如,如果x1n=100,则我希望得到的卷积为n=100

编辑2 -添加示例

我认为卷积应该接近于我可以用解析法计算出来的。

import numpy as np
rng = np.random.default_rng(42)
n, u1, u2, u3, sd = 100, 10, 20, 6, 5
u_avg = np.mean([u1,u2,u3])
a = rng.normal(u1, sd, size=n)
b = rng.normal(u2, sd, size=n)
c = rng.normal(u3, sd, size=n)
z = rng.normal(u_avg, sd/np.sqrt(3), size=n)
convolution = rng.choice(reduce(np.convolve, [a, b, c]), size=n)

print("true distribution")
print(np.round(np.quantile(z, [0.01, 0.25, 0.5, 0.75, 0.99]), 2))
print("convolution")
print(np.round(np.quantile(convolution, [0.01, 0.25, 0.5, 0.75, 0.99]),2))

如果卷积有效,则convolution应接近true分布。

true distribution
[ 3.9   9.84 12.83 14.89 18.45]
convolution
[5.73630000e+03 5.47855750e+05 2.15576037e+06 6.67763665e+06
 8.43843281e+06]

看起来卷积还不够紧密。

wj8zmpe1

wj8zmpe11#

更新

我认为您误用了"卷积"来计算独立正态分布随机变量总和的PDF。需要注意的是,卷积应用于PDF,而不是随机变量。
下面是一个示例代码,可以帮助您找到您想要的结果。给定初始随机变量u1u2u3,如下所示

set.seed(1)
n <- 100
u1 <- 10
u2 <- 20
u3 <- 6
SD <- 5
u <- mean(c(u1, u2, u3))

x1 <- rnorm(n, u1, SD)
x2 <- rnorm(n, u2, SD)
x3 <- rnorm(n, u3, SD)
z <- rnorm(n, u, SD / sqrt(3)) # the random variable that is generated from the objective (desired) distribution

如果要对随机变量x1x2x3进行操作,则应使用以下操作构造目标随机变量x

x <- rowMeans(cbind(x1, x2, x3))

你会发现

> mean(x)
[1] 12.16792

> sd(x)
[1] 2.752923

而"期望的"统计量

> u
[1] 12

> SD / sqrt(3)
[1] 2.886751

上一个关于"卷积"的答案

您可以尝试使用软件包pracma中的conv

> library(pracma)

> x <- c(1, 2)

> y <- c(2, 3, 4)

> z <- c(-1, 0, 1, 5)

> Reduce(conv, list(x, y, z))
[1] -2 -7 -8  9 45 58 40
hts6caw3

hts6caw32#

在Python中:

import numpy as np
from functools import reduce

x1 = np.random.normal(0, 1, 100)
x2 = np.random.normal(0, 1, 100)
x3 = np.random.normal(0, 1, 100)

result = reduce(np.convolve, [x1, x2, x3])

在R中:

convolve3 <- function(x1, x2, x3) {
  result <- convolve(x1, x2)
  result <- convolve(result, x3)
  return(result)
}

x1 <- rnorm(100)
x2 <- rnorm(100)
x3 <- rnorm(100)

result <- Reduce(convolve3, list(x1, x2, x3))

相关问题