Исходя из комментариев, вот кое-что, с чего следует начать.
Я использую rstan
, чтобы согласовать двумерное нормальное распределение с данными. Мы получаем апостериорные плотности для параметров mu
(среднее значение, вектор длины 2) и Sigma
(ковариационная матрица 2x2).
Начнем с загрузки необходимой библиотеки и данных выборки.
library(rstan)
df <- structure(c(96L, 37L, 18L, 40L, 57L, 46L, 8L, 47L, 3L, 75L, 13L,
61L, 42L, 72L, 48L, 4L, 79L, 5L, 97L, 6L), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("V1", "V2")))
df <- setNames(as.data.frame(df), c("x1", "x2"))
Теперь мы определим нашу модель
model <- "
data {
int<lower=1> N; // Number of samples
vector[2] y[N]; // Samples
}
parameters {
vector[2] mu;
cov_matrix[2] Sigma;
}
model {
// Likelihood
y ~ multi_normal(mu, Sigma);
}
"
Мы не указываем никаких параметров для параметров, которые по умолчанию равны плоским (неинформативным) приорам. Обратите внимание, что это обычно не очень хорошая идея; тем не менее, выбор основных правил часто требует знания предметной области c и выходит за рамки этого небольшого упражнения. Вы можете найти более подробную информацию здесь .
Давайте подгоним модель
fit <- stan(model_code = model, data = list(N = nrow(df), y = df))
и извлечем образцы из задней плотности сустава для mu
df_samples <- as.data.frame(extract(fit, "mu"))
Теперь мы можем визуализировать данные вместе с достоверным эллипсом на 95% для расчетного среднего mu
.
library(ggplot2)
ggplot(df, aes(x1, x2)) +
geom_point() +
stat_ellipse(data = df_fit, aes(mu.1, mu.2), colour = "orange") +
theme_minimal()
![enter image description here](https://i.stack.imgur.com/9hvjF.png)
Обратите внимание, что
- точки обозначают исходные точки данных
- оранжевый эллипс обозначает достоверный эллипс на 95% от оцененного среднего параметра из двумерного нормального распределения. Эллипс содержит 95% задней плотности сустава для
mu
.