Построение нормальных распределений на ребристой линии с помощью ggridges - PullRequest
1 голос
/ 04 июня 2019

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

То, к чему я стремлюсьfor - это простой график из нескольких нормальных распределений, которые вычисляются из данных средних значений и SD в моих данных, как в этом примере:

case_number    caseMean    caseSD
case1          0           1
case2          1           2
case3          3           3

Все примеры, которые я нашел, работают с сериями измерений,как в примере с температурой в Линкольне, NE: Пример участка с ребристой линией https://cran.r -project.org / web / packages / ggridges / vignettes / ввод.html , и я не могузаставить их работать.

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

Большое спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Правка - добавлен точный теоретический ответ.

Вот способ использования dnorm для построения точных нормальных кривых с этими характеристиками:

library(tidyverse); library(ggridges)
n = 100
df3 <- df %>%
  mutate(low  = caseMean - 3 * caseSD, high = caseMean + 3 * caseSD) %>%
  uncount(n, .id = "row") %>%
  mutate(x    = (1 - row/n) * low + row/n * high, 
         norm = dnorm(x, caseMean, caseSD))
ggplot(df3, aes(x, case_number, height = norm)) +
  geom_ridgeline(scale = 3)

enter image description here


Аналогично ответу Sada93 с использованием dplyr и tidyr:

library(tidyverse); library(ggridges)
n = 50000
df2 <- df %>% 
  uncount(n) %>%
  mutate(value = rnorm(n(), caseMean, caseSD))
ggplot(df2, aes(x = value, y = case_number)) + geom_density_ridges()

enter image description here

пример данных:

df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "case_number    caseMean    caseSD
case1          0           1
case2          1           2
case3          3           3")
0 голосов
/ 04 июня 2019

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

library(ggplot2)
library(ggridges)

data = data.frame(case = c("case1","case2","case3"),caseMean = c(0,1,3),caseSD = c(1,2,3))

#Create 100 rows for each mean and SD

data_plot = data.frame(case = character(),value = numeric())
n = 100
for(i in 1:nrow(data)){

  case = data$case[i]
  mean = data$caseMean[i]
  sd = data$caseSD[i]

  val = rnorm(n,mean,sd)

  data_plot = rbind(data_plot,
                    data.frame(case = rep(case,n),
                               value = val))
}

ggplot(data = data_plot,aes(x = value,y = case))+geom_density_ridges()

...