2017-01-23 7 views
1

У меня есть следующий рабочий игрушечный пример:Как игнорировать cor.test: «не достаточно конечных наблюдений» и по-прежнему, при использовании tidyverse и ggplot2 (ggpmisc)

trunctiris <- iris [1:102,] 
analysis <- trunctiris %>% 
    group_by(Species) %>% 
    nest() %>% 
    mutate(model = map(data, ~lm(Sepal.Length ~ Sepal.Width, data = .)), 
     cor = map(data, ~tidy(cor.test(.x$Sepal.Length, .x$Sepal.Width), 3))) 

stats <- analysis %>% 
    unnest(cor) 

ggplot(trunctiris, aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point(shape = 21) + 
    geom_text(data = stats, aes(label = sprintf("r = %s", round(estimate, 3)), x = 7, y = 4)) + 
    geom_text(data = stats, aes(label = sprintf("p = %s", round(p.value, 3)), x = 7, y = 3.8)) + 
    geom_smooth(method = "lm", formula = y ~ x) + 
    stat_poly_eq(aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~")), 
       formula = y ~ x, 
       parse = TRUE) + 
    facet_wrap(~Species) 

код был предоставлен другой вопрос , Однако мне не удалось заставить его работать с моими данными. Проблема в том, что у меня есть некоторые (не все) группы, которые имеют менее 3 наблюдений, и поэтому в «аналитической» части R возвращается:

Ошибка в файле mutate_impl (.data, dots): недостаточно конечных наблюдений

, что связано с тем, что в группе недостаточно наблюдений (в данном случае: virginica). Я хочу, чтобы обойти это, я пытался 'попробовать (если nrow (данные)> = 2)' или подобный .. как следующее:

analysis <- iris %>% 
group_by(Species) %>% 
nest() %>% mutate(model = map(data, ~lm (Sepal.Length ~ Sepal.Width, data = .)), 
    cor = if_else(nrow(data) <= 2 , warning ("Must have at least 3 rows of data"), 
     (map(data, ~tidy(cor.test(.x$Sepal.Length, .x$Sepal.Width), 3))))) 

, которая возвращает:

Ошибка в mutate_impl (.data, dots): недостаточно конечных наблюдений Дополнительно: Предупреждающее сообщение: В if_else (список (список (Sepal.Length = c (5.1, 4.9, 4.7, 4.6, 5,: Должен иметь не менее 3 строки данных

Кто-нибудь знает простой способ обойти это? Я бы хотел пропустить проблемную группу и продолжить работу.

Большое спасибо и извините за мои основные навыки R.

+0

Самое легкое решение, о котором я могу думать, - это заранее проверить это в ваших данных, отбросить группы, которые не соответствуют этому критерию, и передать полученный data.frame в 'ggplot'. – lmo

ответ

2

purrr::safely или purrr::possibly позволяют легко защитить себя от ошибок, когда вы находитесь map ping. В этом случае нам нужно обернуть вызов tidy(cor.test(... в possibly и возвращает пустой data.frame, если произошла ошибка

analysis <- trunctiris %>% 
    group_by(Species) %>% 
    nest() %>% 
    mutate(model = map(data, ~lm(Sepal.Length ~ Sepal.Width, data = .)), 
     cor = map(data, possibly(~tidy(cor.test(.x$Sepal.Length, .x$Sepal.Width), 3), 
            otherwise = data.frame()))) 
# A tibble: 3 × 4 
    Species    data model     cor 
     <fctr>   <list> <list>    <list> 
1  setosa <tibble [50 × 4]> <S3: lm> <data.frame [1 × 8]> 
2 versicolor <tibble [50 × 4]> <S3: lm> <data.frame [1 × 8]> 
3 virginica <tibble [2 × 4]> <S3: lm> <data.frame [0 × 0]> #<- Note the empty df here 

Который становится:

unnest(analysis) 
# A tibble: 2 × 9 
    Species estimate statistic  p.value parameter conf.low conf.high 
     <fctr>  <dbl>  <dbl>  <dbl>  <int>  <dbl>  <dbl> 
1  setosa 0.7425467 7.680738 6.709843e-10  48 0.5851391 0.8460314 
2 versicolor 0.5259107 4.283887 8.771860e-05  48 0.2900175 0.7015599 
# ... with 2 more variables: method <fctr>, alternative <fctr> 

Итак, группа, получившая сообщение об ошибке, успешно удаляется из конечного результата.