How to convert R objects of class "ppd" to a clean tibble?

70 views Asked by At

rstanarm::posterior_predict() creates objects of class "ppd" "matrix" "array". I want to convert such objects to clean tibbles. I tried:

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>

Created on 2020-10-16 by the reprex package (v0.3.0)

I would like each column to be a dbl, as we would get if pp were a simple matrix. But, as you can see, each column is, itself, an object of class ppd. How can I convert an object of class "ppd" "matrix" "array" to a tibble with simple numeric columns?

1

There are 1 answers

0
David Kane On

One solution:

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>

Created on 2020-10-29 by the reprex package (v0.3.0)

Surely there is an easier way . . .