R+dplyr nest+purr-跨数据帧行中的嵌套评估模型
这将很难找到一个可复制的例子,因为目前还没有开源数据,我不确定我是否可以分享我拥有的数据。我会尽我最大的努力解释它,如果这不起作用,我可能会花一些时间来模拟一些数据在稍后的点。希望这是一个简单的解决方案 出身背景 我正忙着为我工作领域的动力学建模创建一个R包。我正在尽我所能,使一切都符合tidyverse工具。然而,有一个特殊的用例,我不知道如何去做,因为它涉及到从几种不同的格式中以完全不同的结构提取数据,并在模型中将它们放在一起 在页面上的自述中,我介绍了参考区域模型的解决方案,其中所有输入的长度相同,我可以使用以下工作流:R+dplyr nest+purr-跨数据帧行中的嵌套评估模型,r,dplyr,nls,purrr,tidyverse,R,Dplyr,Nls,Purrr,Tidyverse,这将很难找到一个可复制的例子,因为目前还没有开源数据,我不确定我是否可以分享我拥有的数据。我会尽我最大的努力解释它,如果这不起作用,我可能会花一些时间来模拟一些数据在稍后的点。希望这是一个简单的解决方案 出身背景 我正忙着为我工作领域的动力学建模创建一个R包。我正在尽我所能,使一切都符合tidyverse工具。然而,有一个特殊的用例,我不知道如何去做,因为它涉及到从几种不同的格式中以完全不同的结构提取数据,并在模型中将它们放在一起 在页面上的自述中,我介绍了参考区域模型的解决方案,其中所有输入的
data %>%
gather() %>%
group_by() %>%
do()
问题
但是,对于动脉模型,输入参数如下所示:
大脑动力学数据:时间、值、权重——每个向量长度相同,在本例中为38
血液动力学数据:血液输入-4096行x 4列的数据框。为了方便起见,所有模型都将其作为数据帧读取,并且所有信息都已插值
每个模型都需要所有三个向量的输入,以及输入数据帧
我目前将所有数据存储在一个列表中,每个测量都有一个元素。列表中的每个元素都包含1。一个数据框,包含大脑每个区域的大脑动力学数据,比如说3个区域,以及时间和权重,还有2个。包含输入数据的数据框。因此,我创建了我的最终数据帧
datdf <- map(dat, 'braindf') %>% # Extract the brain data
bind_rows(.id = "id") %>% # Add an id column
select(PET = id, Times = Times, Weights=weights, R1 = Region1, R2 = Region2, R3 = Region3) %>% # Rename and select columns
group_by(PET) %>% # Group by each measurement
nest() %>% # Nest everything
rename(braindata=data) %>% # Rename
mutate(Subjname = stringr::str_extract(....)), # Add subject acronym
PETNo = as.numeric(stringr::str_extract(....)), # Add measurement number
input=map(dat, 'bloodinput')) # Add blood input data frame as a nested column
这给我留下了以下几点
# A tibble: 6 × 5
PET braindata Subjname PETNo bloodinput
<chr> <list> <chr> <dbl> <list>
1 s1_1 <tibble [38 × 6]> s1 1 <data.frame [4,096 × 4]>
2 s1_2 <tibble [38 × 6]> s1 2 <data.frame [4,096 × 4]>
3 s2_1 <tibble [38 × 6]> s2 1 <data.frame [4,096 × 4]>
4 s2_2 <tibble [38 × 6]> s2 2 <data.frame [4,096 × 4]>
5 s1_1 <tibble [38 × 6]> s3 1 <data.frame [4,096 × 4]>
6 s2_2 <tibble [38 × 6]> s3 2 <data.frame [4,096 × 4]>
其中每个大脑数据包含以下内容:
head(datdf[1,]$braindata[[1]])
# A tibble: 6 × 6
Times Weights R1 R2 R3
<dbl> <dbl> <dbl> <dbl> <dbl>
1 0 0 0.00E+00 0.00E+00 0.00E+00
2 22 0.3 1.12E-03 4.14E-03 4.78E-04
3 32 0.5 5.61E-01 4.08E-01 7.38E-01
4 42 0.7 4.53E+01 4.50E+01 5.61E+01
5 52 0.7 8.12E+01 8.07E+01 1.02E+02
6 62 0.9 1.03E+02 1.04E+02 1.31E+02
从这一点上,我不知道如何为每一行拟合模型
这就是我尝试过的:
R1_outcomes <- datdf %>%
group_by(PET) %>% # or rowwise()
mutate(onetcmout = onetcm(t_tac=.$braindata[[1]]$Times/60,
tac=.$braindata[[1]]$R1,
input=.$bloodinput,
weights=.$braindata[[1]]$Weights))
R1_outcomes <- datdf %>%
rowwise() %>%
do(onetcmout = onetcm(t_tac=.$braindata[[1]]$Times/60,
tac=.$braindata[[1]]$R1,
input=.$bloodinput,
weights=.$braindata[[1]]$Weights))
我确信有一种方法可以通过map函数实现这一点,但我不太清楚如何实现
如果您能给我一些建议,我将不胜感激。提前向任何人表示感谢 我认为您的方法不起作用,因为braindata实际上是一个列表列,这打破了.braindata访问的限制。您是否尝试过映射模型函数,比如DATYDFF %> %MutaToNETCMOUT= PURR::MAPARBANDATA,ONETCM.第二个想法——您可能需要将ONETCM函数包在自己的包中,这将打开传入的数据文件Brand DATA,或者可以考虑使用Purr::如果你可以发布一些模拟的样本数据,我可以试着帮你实现。你能给我们一个可复制的例子吗?非常感谢你的评论!今天下午我会尽量抽出一些时间来模拟一些数据,否则我可以在周末尝试这样做。我会尽快回复你的!再次感谢!我猜map2braindata,bloodinput,~onetcmt_tac=.x$Times/60,tac=.x$R1,input=.y,weights=.x$weights。也就是说,在一个变异调用中。