Создание кадра данных из взвешенных данных для визуализации данных - PullRequest
1 голос
/ 23 сентября 2019

У меня есть созданный фрейм данных с переменной веса обследования после стратификации.Моей команде по визуализации нужен фрейм данных, где каждая строка является наблюдением.Они хотят визуализировать данные с помощью инструментов, отличных от R.

Конечно, мои невзвешенные данные - это одно наблюдение на строку.Но это невзвешенные данные, у которых распределение ответов по данной переменной отличается от того, что имеют взвешенные данные.

Я посмотрел на пакет 'synthpop', но он не выглядит так, как будто он делает то, что мне нужно.Я не могу понять, есть ли другой пакет, который может помочь, или какой другой код использовать.Я могу вручную рассчитать некоторые из них, но это боль и не так легко воспроизвести.

В настоящее время нет

Ожидаемый фрейм данных будет иметь одно наблюдение на строку, но каждая переменная будет иметь распределение, которое я получу при выполнении взвешенного одномерного анализа с использованием веса опроса.

1 Ответ

0 голосов
/ 24 сентября 2019

Это интересный вопрос, особенно когда проводится различие между техническим вопросом о том, как создать новый кадр данных из взвешенных данных для визуализации , и довольно общим вопросом о том, как взвешенные данные должны быть графически представлены. (в первую очередь).

Я понимаю, что вы уже ответили на последний вопрос, и в результате получили новый фрейм данных из ваших взвешенных данных.В этих взвешенных данных каждая строка представляет фактическое наблюдение, например, участника, который фактически участвовал в опросе.Новый «невзвешенный» фрейм данных должен содержать больше строк с похожими ответами в зависимости от веса каждого участника.

Прежде чем генерировать некоторые данные и смотреть на некоторые примеры, следует отметить, что графическое представление взвешенных данных обследования не является проблемой, если оно основано на агрегированных показателях / элементах.Например, гистограмма, показывающая среднее (среднее) некоторого показателя X, может быть графически представлена ​​почти так же, как будут представлены невзвешенные данные.Единственное отличие состоит в том, что агрегированные значения рассчитываются по-разному (мы использовали бы взвешенное среднее, а не нормальную среднюю функцию в R).

Таким образом, проблема создания нового кадра данных для визуализации взвешенных данных возникает только для некоторыхопределенные типы участков.Здесь на ум приходит график рассеяния, поскольку он показывает все действительные точки данных.

Итак, давайте подумаем, как можно построить диаграмму рассеяния для взвешенных данных.

Сначала давайте сгенерируем некоторые данные.

library(dplyr)
library(tidyr)
library(ggplot2)

# Function to randomly generate weights
set.seed(7)
rtnorm <- function(n, mean, sd, a = -Inf, b = Inf){
  qnorm(runif(n, pnorm(a, mean, sd), pnorm(b, mean, sd)), mean, sd)
}

n <- 1000
data <- data.frame(  age = round(runif(n, min = 18, max = 80), 0),
                   score = round(runif(n, min = 0, max = 100), 0),
                  weight = round(rtnorm(n = n, mean = 1, sd = 1, a = 0.05, b = 10), 1))

Давайте посмотрим на участников с определенным возрастом от 18 до 80, которые ответили на элемент измерения по шкале от 0 до 100 (который я просто назову «счетом»), и эти участники более или менее представляютбазовая совокупность, указанная их «весом».

Теперь давайте посмотрим на данные без учета весов:

data %>% 
  ggplot(., aes(x = age, y = score)) +
  geom_point() 

Диаграмма рассеяния показывает все точки данных, где каждая точка представляет участника, которыйучаствовал в опросе.Тем не менее, диаграмма рассеяния не показывает, как будут выглядеть данные в основной совокупности.

Теперь мы можем мутировать кадр данных, генерируя больше строк из тех участников, которые имеют больший вес.

data %>% 
  mutate(weight2 = weight * (1/min(weight))) %>% 
  uncount(weight2) %>% 
  ggplot(., aes(x = age, y = score)) +
  geom_point()

Однако этот график рассеяния выглядит точно так же, как и первый.Размышляя об этом, хотя было получено больше наблюдений, они расположены в точно таких же координатах x и y.

Чтобы лучше понять, какие точки являются более репрезентативными для основной популяции, желательно рассмотретьвес, чтобы быть другим измерением нашего сюжета.Мы могли бы просто добавить переменную в оператор aes() нашего вызова ggplot, не создавая новый фрейм данных на основе веса.

data %>% 
  ggplot(., aes(x = age, y = score, alpha = weight)) +
  geom_point()

Вместо того, чтобы рассматривать вес как другое измерение нашего графика, мы могли бы фактически преобразоватьнаш фрейм данных в соответствии с весом и используйте ggplot alpha, чтобы сделать видимыми перекрывающиеся точки.

data %>% 
  mutate(weight2 = weight * (1/min(weight))) %>% 
  uncount(weight2) %>% 
  ggplot(., aes(x = age, y = score)) +
  geom_point(alpha = 0.035)

Как видите, результат тот же.

Я не знаю, какой тип графикаваша команда визуализации пытается это сделать, но я бы порекомендовал рассматривать вес как дальнейшее измерение вашего графика и воздерживаться от создания новых данных.

...