Как преобразовать объекты R класса ppd в чистый тиббл?

rstanarm :: posterior_predict () создает объекты матричного массива класса ppd. Хочу превратить такие предметы в чистые тубы. Я пытался:

library(tidyverse)
library(rstanarm)
#> Loading required package: Rcpp
#> This is rstanarm version 2.21.1
#> - See https://mc-stan.org/rstanarm/articles/priors for changes to default priors!
#> - Default priors may change, so it's safest to specify priors, even if equivalent to the defaults.
#> - For execution on a local, multicore CPU with excess RAM we recommend calling
#>   options(mc.cores = parallel::detectCores())


obj <- stan_glm(data = women, height ~ 1, refresh = 0)

pp <- posterior_predict(obj)

pp %>%
  as_tibble()
#> # A tibble: 4,000 x 15
#>    `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`   `10`  `11`  `12`  `13` 
#>    <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd> <ppd>
#>  1 61.1… 61.3… 58.1… 64.7… 59.4… 63.4… 63.9… 64.3… 68.9… 61.3… 65.7… 65.5… 65.5…
#>  2 68.2… 66.8… 68.5… 67.5… 66.9… 67.4… 67.4… 60.5… 62.8… 65.6… 70.8… 64.3… 63.7…
#>  3 66.3… 64.2… 73.2… 68.7… 60.6… 60.7… 64.3… 70.8… 65.0… 68.7… 65.0… 65.2… 60.2…
#>  4 65.4… 61.9… 64.6… 71.1… 59.6… 60.6… 63.0… 57.5… 69.2… 64.5… 63.7… 64.5… 57.0…
#>  5 62.8… 63.1… 59.8… 60.5… 67.8… 60.0… 52.1… 72.1… 66.8… 62.3… 58.0… 68.0… 67.4…
#>  6 70.8… 61.4… 57.8… 69.6… 63.1… 55.9… 67.5… 67.6… 73.8… 57.6… 60.4… 74.6… 64.6…
#>  7 61.7… 61.5… 69.3… 67.7… 70.8… 63.2… 63.5… 65.6… 64.4… 71.6… 67.9… 70.8… 68.2…
#>  8 66.6… 62.0… 74.1… 70.4… 63.9… 58.8… 58.5… 62.5… 70.0… 57.5… 53.4… 62.4… 54.5…
#>  9 67.4… 61.6… 62.7… 69.0… 64.0… 65.4… 62.3… 69.8… 72.0… 61.5… 67.1… 76.0… 70.4…
#> 10 71.6… 65.1… 72.7… 68.9… 57.5… 63.9… 64.9… 65.4… 63.5… 55.1… 71.9… 67.1… 65.7…
#> # … with 3,990 more rows, and 2 more variables: `14` <ppd>, `15` <ppd>

Создано 16 октября 2020 г. пакетом REPEX (v0.3.0)

Я бы хотел, чтобы каждый столбец был dbl, как если бы pp был простой матрицей. Но, как видите, каждый столбец сам по себе является объектом класса ppd. Как преобразовать объект матричного массива класса ppd в таблицу с простыми числовыми столбцами?


person David Kane    schedule 16.10.2020    source источник


Ответы (1)


Одно решение:

library(tidyverse)
library(rstanarm)
#> Loading required package: Rcpp
#> This is rstanarm version 2.21.1
#> - See https://mc-stan.org/rstanarm/articles/priors for changes to default priors!
#> - Default priors may change, so it's safest to specify priors, even if equivalent to the defaults.
#> - For execution on a local, multicore CPU with excess RAM we recommend calling
#>   options(mc.cores = parallel::detectCores())

obj <- stan_glm(data = women, height ~ 1, refresh = 0)

posterior_predict(obj) %>% 
  as_tibble() %>% 
  mutate(across(everything(), as.numeric))
#> # A tibble: 4,000 x 15
#>      `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`  `10`  `11`  `12`  `13`
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1  63.7  67.3  72.8  65.0  72.5  69.3  63.1  74.2  65.7  68.1  62.3  56.5  59.6
#>  2  63.1  63.0  55.1  60.6  66.7  69.2  69.2  65.8  65.9  61.5  70.3  63.4  63.9
#>  3  63.2  60.3  65.8  70.2  63.7  65.3  56.2  62.5  62.2  56.2  69.1  63.3  66.3
#>  4  67.6  59.8  62.3  59.1  61.1  68.6  65.4  63.6  65.4  72.0  71.1  61.8  69.4
#>  5  72.8  62.3  70.8  65.5  66.7  69.2  63.6  71.3  60.2  68.3  67.7  64.8  69.0
#>  6  60.2  66.1  66.5  69.8  64.9  60.7  63.6  69.9  64.8  65.7  64.9  61.2  59.6
#>  7  70.5  60.3  68.0  67.3  75.2  59.0  72.5  67.0  70.7  64.1  55.5  70.5  67.7
#>  8  53.5  64.3  62.9  73.1  68.4  59.2  68.7  67.8  67.0  77.9  68.0  70.8  71.6
#>  9  72.6  65.0  74.3  71.7  65.2  69.1  64.6  64.9  67.0  66.9  56.1  52.3  73.8
#> 10  60.7  62.5  67.3  63.8  64.6  65.1  65.9  64.1  66.5  64.3  63.1  50.0  70.1
#> # … with 3,990 more rows, and 2 more variables: `14` <dbl>, `15` <dbl>

Создано 29 октября 2020 г. пакетом REPEX (v0.3.0)

Конечно, есть способ попроще. . .

person David Kane    schedule 30.10.2020