Корреляция между разными людьми и их рассеянным выстрелом с использованием ggplot2 или ggpubr

Представление моего образца:

dat<-read.table(text=" AN1	AN2	AN3	ANM1	ANM2	ANM3
82	78	77	98	86	93
79	73	99	85	86	77
82	74	84	79	73	76
89	73	96	83	72	80
70	71	72	84	76	99
78	76	95	87	76	98
72	87	74	76	79	88
95	85	85	96	94	81
72	86	99	76	93	72
80	97	90	95	77	91
94	95	79	90	78	95
94	83	84	91	73	100
77	92	95	82	83	95
82	82	84	78	96	90
81	83	85	71	76	95
89	79	87	72	99	98
93	96	84	74	82	86
77	98	89	84	87	86
86	98	92	95	72	89
98	92	99	87	93	99",header=TRUE)

Я хочу провести корреляцию между AN1 и ANM1; AN2 и ANM2 и AN3 и ANM3 с использованием петли. Я хочу получить "базовый сюжет", который доступен здесь. Таким образом, я получу по отдельности три диаграммы рассеяния.

Я использовал следующие коды, но они не работают:

AN<-  dat[1:3]; ANM<- dat[4:6];
lapply(1:3, function(x) ggscatter(AN=[,x],ANM[,x]))


person Community    schedule 06.12.2019    source источник
comment
Пожалуйста, не пишите, что это не работает. Сообщите нам, что происходит не так, вы видите сообщение об ошибке? Сюжеты неправильные? Сюжеты не появляются?   -  person Axeman    schedule 07.12.2019
comment
убрать = из AN=[,x]?   -  person Axeman    schedule 07.12.2019
comment
Я не могу воспроизвести эту ошибку, поскольку вы уже определили AN в своем вопросе. Но вам нужно будет правильно использовать ggscatter: lapply(1:3, function(x) ggpubr::ggscatter(dat, x = names(AN)[x], y = names(ANM)[x]))   -  person Axeman    schedule 07.12.2019
comment
Вы определяете AN<- dat[1:3] в своем вопросе! У меня это работает!   -  person Axeman    schedule 07.12.2019


Ответы (1)


Я думаю, что с помощью цикла for ваш код выглядел бы лучше. Итак, чтобы полностью воспроизвести ваш пример, я бы сделал что-то вроде этого:

library(ggpubr)

dat<-read.table(text=" AN1  AN2 AN3 ANM1    ANM2    ANM3
82  78  77  98  86  93
79  73  99  85  86  77
82  74  84  79  73  76
89  73  96  83  72  80
70  71  72  84  76  99
78  76  95  87  76  98
72  87  74  76  79  88
95  85  85  96  94  81
72  86  99  76  93  72
80  97  90  95  77  91
94  95  79  90  78  95
94  83  84  91  73  100
77  92  95  82  83  95
82  82  84  78  96  90
81  83  85  71  76  95
89  79  87  72  99  98
93  96  84  74  82  86
77  98  89  84  87  86
86  98  92  95  72  89
98  92  99  87  93  99",header=TRUE)

for(i in 1:3){ 
  AN <- paste0("AN", i)
  ANM <- paste0("ANM", i)
  print(
        ggscatter(dat, x = AN, y = ANM)
      )

} 

Чтобы попытаться создать что-то подобное с помощью базовых графиков из предоставленной ссылки, я бы изменил цикл for на что-то вроде:

for(i in 1:3){ 
  AN <- paste0("AN", i)
  ANM <- paste0("ANM", i)
  print(
      ggscatter(dat, x = AN, y = ANM, 
                  add = "reg.line", 
                  conf.int = TRUE, 
                  add.params = list(color = "blue", fill = "lightgray")) + 
      stat_cor(method = "pearson", label.x = 3, label.y = 30) # Here label.x and label.y deform the plot, seems to be a case to tune them to your needs.
      )

}

Теперь, если вы должны использовать lapply, я бы попытался создать некоторую абстракцию, создав функцию:

create_plot <- function(data, prefix_x, prefix_y, index) { 

  x_col <- paste0(prefix_x, index)
  y_col <- paste0(prefix_y, index)

  g <- ggscatter(data, x = x_col, y = y_col, 
                 add = "reg.line", 
                 conf.int = TRUE, 
                 add.params = list(color = "blue", fill = "lightgray")) + 
    stat_cor(method = "pearson")

  return(g)

}

lapply(1:3, create_plot, data = dat, prefix_x = "AN", prefix_y = "ANM")
person luizgg    schedule 06.12.2019