如何忽略cor.test:“没有足够的有限观察”并继续使用tidyverse和ggplot2(ggpmisc)

时间:2017-01-23 16:16:36

标签: r ggplot2 correlation tidyr

我有以下工作玩具示例:

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)中的错误:没有足够的有限观察值

这与该组中没有足够的观察结果有关(在这种情况下:弗吉尼亚州)。我想解决这个问题,我试过'尝试(如果nrow(数据)&gt; = 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中(nrow(list(list(Sepal.Length = c(5.1,4.9,4.7,4.6,5,:   必须至少有3行数据

有没有人知道解决这个问题的简单方法?我想跳过有问题的小组并继续前进。

非常感谢和抱歉我非常基本的R技能。

1 个答案:

答案 0 :(得分:3)

当您purrr::safely ping时,

purrr::possiblymap可以轻松防范错误。在这种情况下,一个好的策略是将调用包装在tidy(cor.test(...possibly并在发生错误时返回空数据。

library(purrr)
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>

因此,从最终结果中成功删除了发出错误的组。