我想在小标题内生成一个双变量分布。这是我要创建的内容:
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)
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。
谢谢。
答案 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