Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R+dplyr nest+purr-跨数据帧行中的嵌套评估模型_R_Dplyr_Nls_Purrr_Tidyverse - Fatal编程技术网

R+dplyr nest+purr-跨数据帧行中的嵌套评估模型

R+dplyr nest+purr-跨数据帧行中的嵌套评估模型,r,dplyr,nls,purrr,tidyverse,R,Dplyr,Nls,Purrr,Tidyverse,这将很难找到一个可复制的例子,因为目前还没有开源数据,我不确定我是否可以分享我拥有的数据。我会尽我最大的努力解释它,如果这不起作用,我可能会花一些时间来模拟一些数据在稍后的点。希望这是一个简单的解决方案 出身背景 我正忙着为我工作领域的动力学建模创建一个R包。我正在尽我所能,使一切都符合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。也就是说,在一个变异调用中。