Search code examples
rexport-to-csvstatistics-bootstrap

How to export results from bootstrapping in R?


I have a time series of 540 observations which I resample 999 times using the following code:

boot.mean = function(x,i){boot.mean = mean(x[i])}
z1 = boot(x1, boot.mean, R=999)
z1
ORDINARY NONPARAMETRIC BOOTSTRAP

Call:
boot(data = x1, statistic = boot.mean, R = 999)

Bootstrap Statistics :
        original        bias    std. error
t1* -0.009381397 -5.903801e-05 0.002524366

trying to export the results gives me the following error:

write.csv(z1, "z1.csv")

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
  cannot coerce class ""boot"" to a data.frame

How can I export the results to a .csv file?

I am expecting to obtain a file with 540 observations 999 times, and the goal is to apply the approx_entropy function from the pracma package, to obtain 999 values for approximate entropy and plot the distribution in Latex.


Solution

  • First, please make sure that your example is reproducible. You can do so by generating a small x1 object, or by generating a random x1 vector:

    > x1 <- rnorm(540)
    

    Now, from your question:

    I am expecting to obtain a file with 540 observations 999 times

    However, this is not what you will get. You are generating 999 repetitions of the mean of the resampled data. That means that every bootstrap replicate is actually a single number.

    From Heroka's comment:

    Hint: look at str(z1).

    The function str shows you the actual data inside the z1 object, without the pretty formatting.

    > str(z1)
     List of 11
     $ t0       : num 0.0899
     $ t        : num [1:999, 1] 0.1068 0.1071 0.0827 0.1413 0.0914 ...
     $ R        : num 999
     $ data     : num [1:540] 1.02 1.27 1.82 -2.92 0.68 ...
     (... lots of irrelevant stuff here ...)
     - attr(*, "class")= chr "boot"
    

    So your original data is stored as z1$data, and the data that you have bootstraped, which is the mean of each resampling, is stored in z1$t. Notice how it tells you the dimension of each slot: z1$t is 999 x 1.

    Now, what you probably want to do is change the boot.mean function by a boot.identity function, which simply returns the resampled data. It goes like:

    > boot.identity = function(x,i){x[i]}
    > z1 = boot(x1, boot.identity, R=999)
    > str(z1)
    List of 11
     $ t0       : num [1:540] 1.02 1.27 1.82 -2.92 0.68 ...
     $ t        : num [1:999, 1:540] -0.851 -0.434 -2.138 0.935 -0.493 ...
     $ R        : num 999
     $ data     : num [1:540] 1.02 1.27 1.82 -2.92 0.68 ...
    (... etc etc etc ...)
    

    And you can save this data with write.csv(z1$t, "z1.csv").