首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何忽略cor.test:“不够有限的观察”,并继续使用tidyverse和ggplot2 (ggpmisc)

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

Stack Overflow用户
提问于 2017-01-23 16:16:36
回答 1查看 2.3K关注 0票数 1

我有下面的工作-玩具例子:

代码语言:javascript
复制
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(数据) >= 2)或类似的。如下所示:

代码语言:javascript
复制
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(list(Sepal.Length= c(5.1,4.9,4.7,4.6,5 ))中必须至少有3行数据

有没有人知道一个简单的方法来避开这件事?我想跳过有问题的组,继续讲下去。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-23 16:43:32

purrr::safelypurrr::possibly允许在mapping时容易地防范错误。在本例中,一个好的策略是将对tidy(cor.test(...的调用包装在possibly中,并在发生错误时返回一个空的data.frame。

代码语言:javascript
复制
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())
    )
  )

3×4种数据模型cor 1 2 versicolor 3 virginica #<- -注意这里的空df

它变成:

代码语言:javascript
复制
unnest(analysis)

A:2×9种统计p.value参数conf.low conf.high 1 setosa 0.7425467 7.680738 6.709843 e-10 48 0.5851391 0.8460314 2杂色0.5259107 4.283887 8.771860 e-05 48 0.2900175 0.7015599 #.增加了两个变量:方法,替代

因此,给出错误的组被成功地从最终结果中删除。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41810811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档