Запуск corrplot для фрейма данных по группе

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

Фрейм данных имеет ту же структуру, что и этот:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Я хотел бы применить функцию corrplot (из пакета corrplot) к данным по группам.

Кто-нибудь может мне помочь?

Я попытался сделать то, что было предложено ниже пользователем 20650, и вот результат:

Это хвост моего фрейма данных:

structure(list(group = structure(c(4L, 4L, 4L, 4L, 4L, 4L), .Label = c("brooksi", 
"copianullum", "fulbrighti", "paratrygonyi"), class = "factor"), 
    total_length = c(17, 25, 15, 9, 22, 25), max_w = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), n_prog = c(NA, NA, NA, NA, 482L, 432L), ceph_pedun_L = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), bothrid_L = c(NA, 870, NA, NA, NA, NA), bothrid_W = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), n_loculi = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_), n_transv_septa = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), stalk_L = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), stalk_W = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), prog_max_W = c(NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_), term_seg_L = c(500L, 
    NA, 400L, 420L, NA, NA), term_seg_L.1 = c(360L, NA, 220L, 
    230L, NA, NA), ratio_term_seg = c(1.39, NA, 1.82, 1.83, NA, 
    NA), term_seg_SA = c(1800, NA, 880, 966, NA, NA), pore_pst_mrgn = c(360L, 
    NA, 260L, 300L, NA, NA), percent_.prog_L = c(72L, NA, 65L, 
    71L, NA, NA), n_progl_LgrW = c(NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_), n_mat_segs = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), n_testes = c(NA, 6L, 6L, 5L, NA, NA), testes_L = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
    ), testes_W = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), length_tst_field = c(NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_), term_c_sac_L = c(150L, 
    NA, 105L, 125L, NA, NA), term_c_sac_W = c(125L, NA, 75L, 
    95L, NA, NA), ovary_L = c(255L, NA, 140L, 135L, NA, NA), 
    Ov_ratio_prog = c(51, NA, 35, 32.1, NA, NA), OV_max_W = c(240, 
    NA, 125, 140, NA, NA)), .Names = c("group", "total_length", 
"max_w", "n_prog", "ceph_pedun_L", "bothrid_L", "bothrid_W", 
"n_loculi", "n_transv_septa", "stalk_L", "stalk_W", "prog_max_W", 
"term_seg_L", "term_seg_L.1", "ratio_term_seg", "term_seg_SA", 
"pore_pst_mrgn", "percent_.prog_L", "n_progl_LgrW", "n_mat_segs", 
"n_testes", "testes_L", "testes_W", "length_tst_field", "term_c_sac_L", 
"term_c_sac_W", "ovary_L", "Ov_ratio_prog", "OV_max_W"), row.names = 563:568, class = "data.frame")

Я попытался сделать то, что вы сказали, с помощью этого кода:

for(i in unique(data$group)) {
    corrplot(cor(data[data$group==i, -match("group", names(data))]))
}

Но я получил эту ошибку:

Error in if (min(corr) < -1 - .Machine$double.eps || max(corr) > 1 + .Machine$double.eps) { : 
  missing value where TRUE/FALSE needed

person uller    schedule 09.11.2015    source источник
comment
Вам необходимо рассчитать корреляцию между количественными переменными для каждой группирующей переменной и применить к каждой коррплот. Было бы полезно, если бы вы могли добавить некоторые данные и вашу попытку. пожалуйста, прочитайте этот stackoverflow.com/questions/5963269/ спасибо   -  person user20650    schedule 09.11.2015
comment
Для начала: par(mfrow=c(2,1)) ; for(i in unique(mtcars$am)) corrplot(cor(mtcars[mtcars$am==i, -match("am", names(mtcars))]))   -  person user20650    schedule 09.11.2015
comment
спасибо за подсказку как сформулировать задачу :)   -  person uller    schedule 09.11.2015


Ответы (1)


Обновить комментарий

Вам нужно рассчитать корреляцию между количественными переменными для каждой группирующей переменной, а затем применить corrplot к каждой.

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

par(mfrow=c(3,1)) 

# loop through the grouping variable
for(i in unique(iris$Species)) {
            corrplot(cor(iris[iris$Species==i, -match("Species", names(iris))]))
           }

iris$Species==i подмножает строки данных для каждой группирующей переменной, а -match("Species", names(iris)) удаляет столбец группирующей переменной, поэтому он не включается в расчет корреляции.

person user20650    schedule 09.11.2015
comment
Я отредактировал свой пост, чтобы показать, что произошло, когда я попытался сделать то, что вы сказали. - person uller; 09.11.2015
comment
Хорошо, вам нужно учесть недостающие данные. Вы делаете это в течение cor. См. ?cor справочную страницу, чтобы увидеть варианты. Разумный способ, вероятно, use="pairwise". Конечно, если у вас много пропущенных переменных, у вас все равно могут возникнуть проблемы. Но тогда вам нужно подумать, какое значение имеет оценка корреляции, когда она оценивается с помощью нескольких наблюдений. - person user20650; 09.11.2015
comment
Я использовал rcorr из пакета Hmisc для выполнения корреляций: m.data ‹- as.matrix(data) # возвращает матрицу корреляции. взгляните на str() этого объекта. cormat ‹- rcorr(m.data, type=pearson) #график корреляционной матрицы corrplot(as.matrix(cormat$r), type=upper, order=AOE, #p.mat = as.matrix(cormat$P) , sig.level = 0,05, insig = пусто, method = color, diag=FALSE, tl.col=black, tl.srt=45) - person uller; 09.11.2015
comment
Пробовал use=pairwise и появилась та же ошибка - person uller; 09.11.2015
comment
Я не знаком с rcorr, но похоже, что по умолчанию он удаляет отсутствующие попарно (без возможности изменить это). Проблема, с которой вы столкнулись, конечно, связана с отсутствием - вам нужно решить, как лучше всего с этим справиться, поскольку функция corrplot не будет работать, если присутствуют пропущенные значения. Итак, первое, что нужно сделать, это создать корреляционную матрицу без пропусков. - person user20650; 09.11.2015
comment
Что можно попробовать... вы можете удалить столбцы со всеми / полными отсутствующими (idx <- which(colSums(is.na(dat))!=nrow(dat)); newd <- dat[idx] ; cor(newd[-1], use="pairwise") - но, как вы можете видеть, для хвоста ваших данных выше все еще не хватает некоторых. Поэтому вам нужно посмотреть на эти переменные и решить, если это стоит включить их - возможно, если количество пропавших без вести превышает определенную долю - person user20650; 09.11.2015