Линейный график с использованием средств передачи данных и группировки

#r #statistics #mean #linegraph

#r #Статистика #среднее #линейный график

Вопрос:

df это:

 gender party mean(salary)

1 female democrat 31833.33    
2 female republican 27000.00    
3 male democrat 30250.00    
4 male republican 36166.67
  

Постройте линейный график средних значений для мужчин-демократов, женщин-демократов, мужчин-республиканцев и женщин-республиканцев, со всеми средними значениями, показанными на одном графике, и столбиками ошибок, показывающими 95% доверительные интервалы. Нанесите политическую принадлежность на ось x, а зарплату — на ось y. Определите линии для мужских и женских средств с помощью изменения жирности линии, формы символа, цвета или стиля штриха.

Это моя попытка:

 ggplot(df, aes(x=party, y='mean(salary)', group=gender))  
  geom_line(aes(color=gender)) 
  geom_point(aes(color=gender) 
  stat_summary(fun.data = mean_cl_normal, geom = "errorbar", position = position_dodge(width = 0.90),width=0.2))
  

И получается как одна плоская линия от демократа до республиканца.

Вот мои необработанные данные по запросу:

 salary party gender
1 34000 republican male
2 31000 republican female
3 28000 democrat male
4 29000 democrat female
5 30000 republican male
6 23000 republican female
7 27500 democrat male
8 32000 democrat female
9 32000 republican male
10 28000 republican female
11 30000 democrat male
12 34000 democrat female
13 39000 republican male
14 27000 republican female
15 34000 democrat male
16 30000 democrat female
17 40000 republican male
18 26000 republican female
19 30000 democrat male
20 35000 democrat female
21 42000 republican male
22 27000 republican female
23 32000 democrat male
24 31000 democrat female
  

Комментарии:

1. У вас есть x = party эстетика, в результате party чего вы представляете свою ось x. Но неясно, чего именно вы хотите. Не могли бы вы подробнее описать, как должен выглядеть ваш график (линейный или линейный график, какой должна быть ось и т. Д.)? Кроме того, df похоже, что у вас уже есть обобщенные средние значения, вы хотели отобразить те же точные значения? Из этих средств были ли стандартные ошибки уже вычислены и доступны в другом месте? Другой подход заключается в том, чтобы вы предоставили пример необработанных данных, если они у вас есть, и вы могли бы получить помощь как по обобщению, так и по дальнейшему построению графика.

2. Хорошо, я добавил еще несколько деталей и добавил необработанные данные

Ответ №1:

Хотя вы могли бы создать линейный график, может быть, вас может заинтересовать линейчатый график? Это может быть более привлекательным для номинальных категорий, таких как политическая партия.

Вот один из подходов, использующий dplyr и ggplot2 . Сначала определите среднее и стандартное отклонение для каждой party gender комбинации и. Затем вы можете использовать geom_bar и geom_errorbar для построения графика.

 library(ggplot2)
library(dplyr)

df %>%
  group_by(party, gender) %>%
  summarise(mean=mean(salary),
            sd=sd(salary)) %>%
  ggplot(aes(x=party, y=mean, fill=gender))  
    geom_bar(position=position_dodge(width=.75), stat = "identity", width=.7)  
    geom_errorbar(aes(ymin=mean-sd, ymax=mean sd), position=position_dodge(width=.75), width=.3)
  

График

линейный график

Ответ №2:

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

 library(CGPfunctions)
CGPfunctions::Plot2WayANOVA(salary ~ party * gender, salary_df)
#> 
#> Converting party to a factor --- check your results
#> 
#> Converting gender to a factor --- check your results
#> 
#> Blah blah lots of important info to the console ...
#> Interaction graph plotted...
  

Вручную это выглядит примерно так…

 library(dplyr)
library(ggplot2)

# summarise what we need
salary_summarised <- salary_df %>%
   group_by(party, gender) %>%
   summarise(
      AVG.salary = mean(salary, na.rm=TRUE),
      SD.salary = sd(salary, na.rm=TRUE),
      N.salary = length(salary),
      SE.salary = sd(salary, na.rm=TRUE) / sqrt(length(salary)),
      CI95Muliplier = qt(.95/2   .5, length(salary) - 1)
   )


# and plot it
ggplot(salary_summarised, 
       aes(x=party, 
           y=AVG.salary, 
           colour=gender, 
           group=gender))  
   geom_errorbar(aes(ymin=AVG.salary - SE.salary*CI95Muliplier, 
                     ymax=AVG.salary   SE.salary*CI95Muliplier), 
                 width=.2, 
                 color = "purple")  
   geom_line()  
   geom_point(aes(y=AVG.salary))  
   xlab("Party")  
   ylab("Salary")  
   ggtitle("Salary with 95% CI")  
   theme_bw()
  

Использование вашего образца данных

 library(readr)
salary_df <- readr::read_table2("salary party gender
34000 republican male
31000 republican female
28000 democrat male
29000 democrat female
30000 republican male
23000 republican female
27500 democrat male
32000 democrat female
32000 republican male
28000 republican female
30000 democrat male
34000 democrat female
39000 republican male
27000 republican female
34000 democrat male
30000 democrat female
40000 republican male
26000 republican female
30000 democrat male
35000 democrat female
42000 republican male
27000 republican female
32000 democrat male
31000 democrat female")