Вопрос или проблема
Я пытаюсь численно вычислить маргинальную функцию плотности, используя совместную функцию плотности вероятности Гаусса, заданную конкретным значением в совместной плотности. Я использую dmvnorm
из пакета mvtnorm
:
library(mvtnorm)
myfun = function(x, y, mu, ht) {
dmvnorm(c(x, y), mean = mu, sigma = ht)
}
Но integrate
показывает, что x и mean имеют несовпадающие размеры
, когда я запускаю код:
integrate(myfun,
lower = -10,
upper = 2,
y = -2,
mu = c(0.06, 0.03),
ht = diag(2))
Когда я тестирую myfun(-1,-2, mu = c(0.06, 0.03), ht = diag(2))
, функция работает. Но я не уверен, почему функция integrate
не работает.
.
Ответ или решение
Для определения и вычисления функции маргинальной плотности вероятности из совместного гауссовского распределения, необходимо сначала понять, что такое совместное распределение и как оно связано с маргинальными распределениями.
Понимание совместного и маргинального распределения
Совместное распределение двух или более случайных величин описывает их поведение совместно. Если у нас есть двумерное нормальное (гауссовское) распределение, оно задается вектором ожиданий и ковариационной матрицей. Маргинальное распределение одной переменной можно получить путем интегрирования совместной плотности по другой переменной.
Формальное представление
Рассмотрим случай двух таких переменных (X) и (Y), где их совместная плотность задана как:
[ f_{X,Y}(x,y) = \frac{1}{2\pi \sqrt{\det(\Sigma)}} \exp\left(-\frac{1}{2} \begin{pmatrix} x – \mu_x \ y – \mu_y \end{pmatrix}^T \Sigma^{-1} \begin{pmatrix} x – \mu_x \ y – \mu_y \end{pmatrix}\right) ]
где
- (\mu = (\mu_x, \mu_y)) — вектор средних значений
- (\Sigma) — ковариационная матрица
Маргинальная плотность переменной (X) может быть получена интегрированием по (Y):
[ fX(x) = \int{-\infty}^{\infty} f_{X,Y}(x,y) \, dy ]
Компьютерная реализация в R
Вам следует использовать функцию integrate
для численного интегрирования. Однако ошибка, которую вы получаете, связана с форматом аргументов, которые вы передаете в функцию myfun
.
Функция myfun
должна принимать аргументы в виде, совместимом с интегратором. Она должна принимать один единственный аргумент (это может быть (x)) и все остальные аргументы должны быть переданы как параметры фиксированной длины.
Пример исправленного кода:
library(mvtnorm)
myfun = function(x, y, mu, ht) {
dmvnorm(c(x, y), mean = mu, sigma = ht)
}
# Функция для интегрирования по y
marginal_fun = function(x, mu, ht) {
# Здесь используем интегратор
integrate(function(y) myfun(x, y, mu, ht), lower = -Inf, upper = Inf)$value
}
# Параметры
mu = c(0.06, 0.03)
ht = diag(2)
# Вычисление маргинальной плотности для конкретного x
marginal_density_value = marginal_fun(-2, mu, ht)
print(marginal_density_value)
Объяснение исправлений
-
Форма Функции:
marginal_fun
теперь принимает только один аргумент (x) для интегрирования. Все остальные параметры ((\mu) и (ht)) фиксированы и передаются в функцию напрямую. -
Интегрирование: Используйте
integrate
для интегрирования плотности по (y) с пределами от (-\infty) до (+\infty).
Заключение
Определение маргинальной плотности из совместного гауссовского распределения – это процесс интеграции. Важно следить за форматом аргументов и совместимостью с функциями интеграции. Подходя соответствующим образом к структуре вашего кода, вы сможете правильно вычислить желаемую маргинальную плотность.