【问题标题】:Collecting p-values within pipe (dplyr)在管道内收集 p 值 (dplyr)
【发布时间】:2018-05-07 22:40:58
【问题描述】:

你好吗?

所以,我有一个如下所示的数据集:

    dirtax_trev indtax_trev lag2_majority pub_exp 
    <dbl>       <dbl>       <dbl>         <dbl>    
    0.1542      0.5186      0             9754
    0.1603      0.4935      0             9260      
    0.1511      0.5222      1             8926     
    0.2016      0.5501      0             9682
    0.6555      0.2862      1             10447

我遇到以下问题。我想沿着一个虚拟变量(lag2_majority)执行一系列 t.tests,收集这个测试的 p 值,并使用管道将其归因于一个向量。

下面选择了我要运行这些 t-tests 的所有变量,然后我省略了我的 t.test 变量 (lag2_majority) 的 NA 值,然后我尝试用这段代码对其进行总结:

test <- g %>%
 select(dirtax_trev, indtax_trev, gdpc_ppp, pub_exp, 
 SOC_tot, balance, fdi, debt, polity2, chga_demo, b_gov, social_dem,
 iaep_ufs, gini, pov4, informal, lab, al_ethnic, al_language, al_religion,
 lag_left, lag2_left, majority, lag2_majority, left, system, b_system,
 execrlc, allhouse, numvote, legelec, exelec, pr) %>%
 na.omit(lag2_majority) %>%
 summarise_all(funs(t.test(.[lag2_majority], .[lag2_majority == 1])$p.value))

但是,一旦我运行它,我得到的响应是:Error in summarise_impl(.data, dots): Evaluation error: data are essentially constant.,这令人困惑,因为沿虚拟变量的均值存在明显差异。当我将上述代码的最后一行替换为:summarise_all(funs(t.test(.~lag2_majority)$p.value)) 时,出现同样的错误。

另外,因为我想做的只是:t.test(dirtax_trev~lag2_majority, g)$p.value,例如,我想我可以做一个循环,像这样: for (i in vars){ t.test(i~lag2_majority, g)$p.value },

其中 vars 是一个对象,其中包含在上述代码中选择的所有变量。但我再次收到一条错误消息。具体来说,这个:Error in model.frame.default(formula = i ~ lag2_majority, data = g): comprimentos das variáveis diferem (encontradas em 'lag2_majority')

我做错了什么?

最好的问候!

【问题讨论】:

  • t.test(.[lag2_majority], .[lag2_majority == 1])$p.value) 不是函数

标签: r dplyr piping


【解决方案1】:

您的问题无法重现,请阅读this 了解如何提高其质量。

我的答案已被概括为可重现,因为我没有您的数据,因此无法直接调整您的代码。

使用 tidy 方法,我将为每个变量生成一个 p-values 数据框。

library(tidyr)
library(dplyr)
library(purrr)

mtcars %>%
  select_if(is.numeric) %>%
  map(t.test) %>%
  lapply(`[[`, "p.value") %>%
  as_tibble %>%
  gather(key, p.value)

# # A tibble: 11 x 2
#     key      p.value
#   <chr>        <dbl>
# 1   mpg 1.526151e-18
# 2   cyl 5.048147e-19
# 3  disp 9.189065e-12
# 4    hp 2.794134e-13
# 5  drat 1.377586e-27
# 6    wt 2.257406e-18
# 7  qsec 7.790282e-33
# 8    vs 2.776961e-05
# 9    am 6.632258e-05
# 10 gear 1.066949e-23
# 11 carb 4.590930e-11

更新

感谢您更新您的问题,请注意,您在之前的评论中包含的值可能来自您的原始数据集,并且在这里仍然无法重现。当我运行代码时,这是输出。

t.test(dirtax_trev ~ lag2_majority, g)$p.value
# [1] 0.5272474

请以任何人都可以像您一样看到问题的方式来构建您的问题。

为了建立您通过t.test 运行的公式,我采用了稍微不同的方法。

library(magrittr)
library(dplyr)
library(purrr)

g <- tribble(
  ~dirtax_trev, ~indtax_trev, ~lag2_majority, ~pub_exp,
  0.1542, 0.5186, 0, 9754,
  0.1603, 0.4935, 0, 9260,
  0.1511, 0.5222, 1, 8926,
  0.2016, 0.5501, 0, 9682,
  0.6555, 0.2862, 1, 10447
)

dummy <- "lag2_majority"

colnames(g) %>%
  .[. != dummy] %>%          # vector of variables to send through t.test
  paste(., "~", dummy) %>%   # build formula as character
  map(as.formula) %>%        # convert to formula class
  map(t.test, data = g) %$%  # run t.test for each, note the special operator
  tibble(
    data.name = unlist(lapply(., `[[`, "data.name")),
    p.value = unlist(lapply(., `[[`, "p.value"))
  )

# # A tibble: 3 x 2
#                      data.name   p.value
#                          <chr>     <dbl>
# 1 dirtax_trev by lag2_majority 0.5272474
# 2 indtax_trev by lag2_majority 0.5021217
# 3     pub_exp by lag2_majority 0.8998690

如果您希望从data.name 中删除虚拟变量名称,您可以在tibble 中修改其分配:

data.name = unlist(strsplit(unlist(lapply(., `[[`, "data.name")), paste(" by", dummy)))

注意我使用来自magrittr 的特殊%$% 来公开测试列表中的名称以构建数据框。我敢肯定还有其他更优雅的方法,但是,我发现这种形式很容易推理。

【讨论】:

  • 凯文,谢谢你的回答。我试图重新构建我的问题,以便稍微澄清一下,我希望这会有所帮助。很抱歉对于这个误会。实际上,我运行了你的代码,它确实收集了一些 p 值,但不是来自“正确的”p 测试,因为我不知道它比较的意思。第一个测试t.test(dirtax_trev~lag2_majority, g)$p.value 给出 0.00016,而使用您指定的代码,它产生的 p 值为 3.199368e-36
  • 凯文,非常感谢!如果我运行您的代码,它会完美运行。但是由于某种原因,如果我用tribble 替换您创建的数据集,我已经得到的响应是:Error in if (stderr &lt; 10*.Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant"):missing value where TRUE/FALSE needed In addition。无论如何,我的数据集有问题。感谢您的努力!
  • @ELazzari,您的数据中存在一个或多个问题,有许多问题(hereherehere)可以指导您解决这些问题。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2017-05-07
相关资源
最近更新 更多