#r #ggplot2
Вопрос:
В течение нескольких лет я использовал (превосходную) функцию диаграммы.корреляции в PerformanceAnalytics для подготовки сводных графиков для многомерных данных. Однако, похоже, у него нет вариантов использования взвешенных данных (с которыми мне всегда приходится иметь дело). Я начинаю изучать синтаксис ggplot2, поскольку в нем, похоже, есть возможность взвешивания данных в большинстве функций. Мне интересно, существует ли ggplot2, эквивалентный chart.correlation (см. Изображение ниже), или мне придется создавать свой собственный? Пример кода из PerformanceAnalytics ниже, который быстро создает очень богатый данными и интерпретацией график.
data(managers)
chart.Correlation(managers[,1:8], histogram=TRUE, pch=" ")
Комментарии:
1.
ggplot2
он очень мощный и гибкий, и при наличии достаточного количества знаний его можно использовать для создания многих типов сюжетов. Я не знаю оPerformanceAnalytics
пакете, но если вы покажете желаемый результат, которого хотите достичь,ggplot2
я уверен, что найдется способ
Ответ №1:
Если вы хотите использовать ggplot2
функциональность, вы можете использовать GGally::ggpairs
следующее:
library(ggplot2)
library(GGally)
ggpairs(data.table(PerformanceAnalytics::managers)[,1:8])
Вы можете определить функции для нижнего, диагонального и верхнего участков. Вот простой пример, где я определяю функцию для нижних графиков, которая является простой ggplot
с geom_point
и geom_smooth
lower_plots <- function(data, mapping, ...) {
ggplot(data = data, mapping = mapping)
geom_point(color = "black")
geom_smooth(method="gam",...)
}
ggpairs(
data.table(PerformanceAnalytics::managers)[,1:8],
diag = list(continuous = wrap("barDiag", bins=50)),
lower = list(continuous = wrap(lower_plots, color="red", se=F))
)
Если бы у вас был вектор весов ( wts
), вы могли бы настроить свою корреляцию на верхних панелях, создав пользовательскую функцию для верхнего:
upper_plots <- function(data,mapping, weights) {
# extract x and y data from mapping
x <- data[[rlang::get_expr(mapping[["x"]])]]
y <- data[[rlang::get_expr(mapping[["y"]])]]
# get weighted correlation
res <- round(cov.wt(data.frame(x,y), wt=weights, cor=T)$cor[1,2],2)
# plot weighted correlation as a label in a blank plot
ggplot() theme_void() geom_text(aes(0,0,label=res))
}
затем, в рамках вашего ggpairs
вызова, вы установите значение upper для обернутой версии этой функции
upper = list(continuous = wrap(upper_plots, weights = wts))
Комментарии:
1. Неплохо… просто нужно было добавить библиотеку строк(data.table)! Ожидайте, что теперь мне просто нужно провести небольшое исследование о том, как работать со взвешенными переменными (поиск гистограмм и корреляций, взвешенных по данным).
2. @Markm0705 если у вас есть небольшой набор данных с примерами весов, чтобы мне было легче понять, что вы на самом деле хотите сделать, я был бы рад попытаться помочь
3. Спасибо вам за ваше предложение о помощи. Обычно информация, с которой я сталкиваюсь, взвешивается по поддержке (площадь, длина, масса и так далее). Если вы запустите эти четыре строки, чтобы добавить столбец веса в набор данных «менеджеры», который даст разумный прокси-сервер во фрейме данных «df». df < — (Анализ производительности::менеджеры) df < — df[complete.cases(df),] Wts < — rnorm(длина(df$HAM1), среднее значение = 5, sd = 1) df$Wts
4. @Markm0705 добавил пример пользовательской функции для верхнего, которая получает взвешенную корреляцию, а затем вызывает эту функцию в
upper