R:dplyr变异中的领带模拟

时间:2019-04-09 15:26:25

标签: r dplyr mutate

我想在小标题内生成一个双变量分布。这是我要创建的内容:

library(copula); library(tidyverse)
n <- 10e3; alpha <- 2.6
tib1 <- tibble(locid = seq(n))
tib2 <- rCopula(n, gumbelCopula(alpha)) %>% as_tibble
plot(tib2$V1, tib2$V2)

a busy cat

cor(tib2$V1, tib2$V2)大致为0.8的地方

但是,当我将其作为函数插入小标题时,它似乎无法按预期工作,即K1和K2不相关。

testfn <- function(n) rCopula(n, gumbelCopula(alpha)) %>% as_tibble

tib3 <- tib1 %>% 
mutate(K1 = testfn(n)$V1,
       K2 = testfn(n)$V2)

cor(tib3$K1, tib3$K2)zero

之所以我想在dplyr中而不是像cbind这样去做,是因为我想在mutate函数中操纵K1和K2。

谢谢。

1 个答案:

答案 0 :(得分:1)

问题出在您的mutate语句内;您将调用函数testfn(n)两次(从而模拟两个新数据集),并使用第一个调用的输出中的V1分配K1并使用第二个调用的V2分配K2。

您要使用tib1中已定义的数据。

由于tib1已经通过管道传递给mutate()(tib1 %>% mutate(...)),因此在分配K1和K2时可以直接引用V1和V2:

set.seed( 1337 ) # set the RNG
library(copula); # for rCopula()
library(tidyverse); # for dplyr::mutate() and pipe syntax (%>%)
n <- 10e3; alpha <- 2.6; # define simulation parameters

# wrap the rCopula call in a function that returns a tibble
testfn <- function(n, .alpha = alpha){ rCopula(n, gumbelCopula(.alpha)) %>% as_tibble }

tib1 <- testfn(n)


# assign K1 and K2 using V1 and V2 (piped in from tib1),
# assign K1old and K2old using output from two (independent) calls to testfn(n)
tib3  <- tib1 %>%
  mutate(K1 = V1,
         K2 = V2,
         K1old = testfn(n)$V1,
         K2old = testfn(n)$V2,)

测试相关性,

# correlations
tib3 %>% summarize(cor(K1old, K2old)) ## -0.0148
tib3 %>% summarize(cor(K1, K2)) ## 0.808