我正在尝试使用嵌套数据框(https://r4ds.had.co.nz/many-models.html)方法来拟合多个潜在类增长曲线,使用lcmm::lcmm()and purrr::pmap()。
此过程需要使用 lcmm() 拟合具有一类 ( k = 1 ) 的模型,然后将此模型用作 的输入,该模型将来自此k = 1模型lcmm::gridsearch()的起始值输入到k = 2+类模型中。还需要对k = 2+模型(加上两个其他参数)的模型调用,它作为对 . 的调用中的调用传递。我通常的方法是使用将参数列表传递给,但立即评估模型调用并尝试拟合模型而不是将模型调用传递给(参见purrr::pmap 与 rlang 的混淆行为;“引用" 或不引用 Qgridsearch()lcmm()gridsearch()pmap()gridsearch()list()lcmm()gridsearch())。
NB 使用 RStudio 的函数查看器 (F2),似乎lcmm::gridsearch()使用用户定义的随机起始值数量match.call()来调整k = 2+模型调用,然后遍历这些以找到首选的k = 2+解决方案。
我在下面包含了一个代表。在 pmap 中包装对 gridsearch 的调用时,命令失败并显示“mutate_impl(.data, dots) 中的错误:评估错误:参数的长度为零。” - 我认为这是因为 R 试图评估对lcmm()k = 2+模型的调用,但我可能是错的。
如何延迟评估lcmm()when 作为参数传递给pmap()?
下面的代表:
library(lcmm)
#> Warning: package 'lcmm' was built under R version 3.5.2
#> Loading required package: survival
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tidyr)
library(purrr)
# load lcmm example data
data("data_lcmm")
# take sample
set.seed(123)
data_lcmm <-
data_lcmm %>%
sample_frac(0.1)
# NB grouping variable is needed to reproduce desired data structure
data_lcmm <-
data_lcmm %>%
mutate(group_var = sample(c(0, 1),
size = nrow(data_lcmm),
replace = TRUE
))
data_lcmm_nest <-
data_lcmm %>%
group_by(group_var) %>%
nest() %>%
mutate(data= map(data, as.data.frame))
# lcmm call from ?lcmm
lcmm_k1 <- function(df) {
lcmm(Ydep2 ~ Time + I(Time^2),
random = ~Time, subject = "ID", ng = 1,
data = data_lcmm_nest$data[[1]], link = "linear"
)
}
# fit k = 1 models
data_lcmm_nest <-
data_lcmm_nest %>%
mutate(lcgm = map(data, lcmm_k1))
#> Be patient, lcmm is running ...
#> The program took 0.18 seconds
#> Be patient, lcmm is running ...
#> The program took 0.19 seconds
# this works for a single row
desired_result <-
gridsearch(
m = lcmm(Ydep2 ~ Time + I(Time^2),
mixture = ~Time,
random = ~Time, subject = "ID", ng = 2,
data = data_lcmm_nest$data[[1]], link = "linear"
),
rep = 5,
maxiter = 2,
minit = data_lcmm_nest$lcgm[[1]]
)
#> Be patient, lcmm is running ...
#> The program took 0.45 seconds
#> Be patient, lcmm is running ...
#> The program took 0.45 seconds
#> Be patient, lcmm is running ...
#> The program took 0.45 seconds
#> Be patient, lcmm is running ...
#> The program took 0.45 seconds
#> Be patient, lcmm is running ...
#> The program took 0.47 seconds
#> Be patient, lcmm is running ...
#> The program took 0.61 seconds
# this fails with Error in mutate_impl(.data, dots) :
# Evaluation error: argument is of length zero.
data_lcmm_nest %>%
mutate(lcgm_2 = pmap(
list(
m = lcmm(Ydep2 ~ Time + I(Time^2),
mixture = ~Time,
random = ~Time, subject = "ID", ng = 2,
data = data, link = "linear"
),
rep = 5,
maxiter = 2,
minit = lcgm
), gridsearch
))
#> Error in mutate_impl(.data, dots): Evaluation error: argument is of length zero.
# wrapping gridsearch in helper also fails
grid_search_helper <- function(g_rep, g_maxiter, g_minit, g_m) {
gridsearch(
m = lcmm(Ydep2 ~ Time + I(Time^2),
mixture = ~Time,
random = ~Time, subject = "ID", ng = 2,
data = g_m, link = "linear"
),
rep = g_rep,
maxiter = g_maxiter,
minit = g_minit
)
}
data_lcmm_nest %>%
mutate(lcgm_2 = pmap(
list(
5,
2,
lcgm,
data
), grid_search_helper
))
#> Error in mutate_impl(.data, dots): Evaluation error: object 'g_m' not found.
由reprex 包(v0.2.1)于 2019 年 1 月 24 日创建