Michael Friendly
2011-Dec-21 19:16 UTC
[R] matrix multivariate bootstrap: order of results in $t component
[This question is hopefully straight-forward, but difficult to provide reproducible code.] I'm doing a multivariate bootstrap, using boot::boot(), where the output of the basic computation is a k x p matrix of coefficients, representing a tuning constant x variable, as shown in the $t0 component from my run, giving a 3 x 6 matrix > lboot$t0 GNP Unemployed Armed.Forces Population Year GNP.deflator 0.00 -3.4472 -1.828 -0.6962 -0.34420 8.432 0.15738 0.01 -0.1798 -1.361 -0.5881 -1.00317 5.656 -0.02612 0.08 1.0907 -1.086 -0.4583 -0.08596 2.642 0.57025 > ?boot doesn't say how these are strung out to give the 1 x 18 vector in each row of lboot$t, but I believe it is done columnwise -- is this correct? That is, I think that the column names for the bootstrap results, lboot$t, should vary most quickly down the columns: > c(t(outer(colnames(lboot$t0), rownames(lboot$t0), paste, sep=':'))) [1] "GNP:0.00" "GNP:0.01" "GNP:0.08" [4] "Unemployed:0.00" "Unemployed:0.01" "Unemployed:0.08" [7] "Armed.Forces:0.00" "Armed.Forces:0.01" "Armed.Forces:0.08" [10] "Population:0.00" "Population:0.01" "Population:0.08" [13] "Year:0.00" "Year:0.01" "Year:0.08" [16] "GNP.deflator:0.00" "GNP.deflator:0.01" "GNP.deflator:0.08" > So, the first bootstrap resample would correspond to > lboot$t[1,] GNP:0.00 GNP:0.01 GNP:0.08 Unemployed:0.00 -10.1495 -0.8622 1.0566 -2.6131 Unemployed:0.01 Unemployed:0.08 Armed.Forces:0.00 Armed.Forces:0.01 -1.5316 -1.1988 -0.9279 -0.7141 Armed.Forces:0.08 Population:0.00 Population:0.01 Population:0.08 -0.5748 1.8401 -0.9989 -0.3155 Year:0.00 Year:0.01 Year:0.08 GNP.deflator:0.00 12.8984 6.4378 2.7761 0.9417 GNP.deflator:0.01 GNP.deflator:0.08 0.1871 0.9797 Or, as a matrix: > matrix(lboot$t[1,], nrow=3) [,1] [,2] [,3] [,4] [,5] [,6] [1,] -10.1495 -2.613 -0.9279 1.8401 12.898 0.9417 [2,] -0.8622 -1.532 -0.7141 -0.9989 6.438 0.1871 [3,] 1.0566 -1.199 -0.5748 -0.3155 2.776 0.9797 > Finally, if the above is correct, how can I easily take my R=800 bootstrap estimates in the 800 x 18 matrix lboot$t and restructure them in a (2400=800x3) x 6 matrix or data.frame corresponding to stacking the matrices like the above for each bootstrap sample? thanks, -Michael -- Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept. York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 4700 Keele Street Web: http://www.datavis.ca Toronto, ONT M3J 1P3 CANADA
John Fox
2011-Dec-21 20:29 UTC
[R] matrix multivariate bootstrap: order of results in $t component
Hi Michael, There may be a cleverer way to do this without a loop, but I think that the following does what you want:> t <- matrix(1:(800*18), 800, 18, byrow=TRUE) # for a reproducible example > head(t)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 2 3 4 5 6 7 8 9 10 [2,] 19 20 21 22 23 24 25 26 27 28 [3,] 37 38 39 40 41 42 43 44 45 46 [4,] 55 56 57 58 59 60 61 62 63 64 [5,] 73 74 75 76 77 78 79 80 81 82 [6,] 91 92 93 94 95 96 97 98 99 100 [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [1,] 11 12 13 14 15 16 17 18 [2,] 29 30 31 32 33 34 35 36 [3,] 47 48 49 50 51 52 53 54 [4,] 65 66 67 68 69 70 71 72 [5,] 83 84 85 86 87 88 89 90 [6,] 101 102 103 104 105 106 107 108> tt <- matrix(0, 2400, 6) > cols <- rep(1:6, 3) > for (i in 1:800){+ tt[((i - 1)*3 + 1):(i*3), cols] <- t[i, ] + }> head(tt)[,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 4 7 10 13 16 [2,] 2 5 8 11 14 17 [3,] 3 6 9 12 15 18 [4,] 19 22 25 28 31 34 [5,] 20 23 26 29 32 35 [6,] 21 24 27 30 33 36 I'm pretty sure that the bootstrapped matrix is organized as you suggest, since R matrices are stored in column-major order. Best, John> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of Michael Friendly > Sent: December-21-11 2:17 PM > To: R-help > Subject: [R] matrix multivariate bootstrap: order of results in $t > component > > [This question is hopefully straight-forward, but difficult to provide > reproducible code.] > > I'm doing a multivariate bootstrap, using boot::boot(), where the > output of the basic computation is a k x p matrix of coefficients, > representing a tuning constant x variable, as shown in the $t0 > component from my run, giving a 3 x 6 matrix > > > lboot$t0 > GNP Unemployed Armed.Forces Population Year GNP.deflator > 0.00 -3.4472 -1.828 -0.6962 -0.34420 8.432 0.15738 > 0.01 -0.1798 -1.361 -0.5881 -1.00317 5.656 -0.02612 > 0.08 1.0907 -1.086 -0.4583 -0.08596 2.642 0.57025 > > > > ?boot doesn't say how these are strung out to give the 1 x 18 vector in > each row of lboot$t, but I believe it is done columnwise -- is this > correct? > > That is, I think that the column names for the bootstrap results, > lboot$t, should vary most quickly down the columns: > > > c(t(outer(colnames(lboot$t0), rownames(lboot$t0), paste, sep=':'))) > [1] "GNP:0.00" "GNP:0.01" "GNP:0.08" > [4] "Unemployed:0.00" "Unemployed:0.01" "Unemployed:0.08" > [7] "Armed.Forces:0.00" "Armed.Forces:0.01" "Armed.Forces:0.08" > [10] "Population:0.00" "Population:0.01" "Population:0.08" > [13] "Year:0.00" "Year:0.01" "Year:0.08" > [16] "GNP.deflator:0.00" "GNP.deflator:0.01" "GNP.deflator:0.08" > > > > So, the first bootstrap resample would correspond to > > > lboot$t[1,] > GNP:0.00 GNP:0.01 GNP:0.08 > Unemployed:0.00 > -10.1495 -0.8622 1.0566 - > 2.6131 > Unemployed:0.01 Unemployed:0.08 Armed.Forces:0.00 > Armed.Forces:0.01 > -1.5316 -1.1988 -0.9279 - > 0.7141 > Armed.Forces:0.08 Population:0.00 Population:0.01 Population:0.08 > -0.5748 1.8401 -0.9989 - > 0.3155 > Year:0.00 Year:0.01 Year:0.08 > GNP.deflator:0.00 > 12.8984 6.4378 2.7761 > 0.9417 > GNP.deflator:0.01 GNP.deflator:0.08 > 0.1871 0.9797 > > Or, as a matrix: > > > matrix(lboot$t[1,], nrow=3) > [,1] [,2] [,3] [,4] [,5] [,6] > [1,] -10.1495 -2.613 -0.9279 1.8401 12.898 0.9417 [2,] -0.8622 -1.532 > -0.7141 -0.9989 6.438 0.1871 > [3,] 1.0566 -1.199 -0.5748 -0.3155 2.776 0.9797 > > > > Finally, if the above is correct, how can I easily take my R=800 > bootstrap estimates in the 800 x 18 matrix lboot$t and restructure them > in a (2400=800x3) x 6 matrix or data.frame corresponding to stacking > the matrices like the above for each bootstrap sample? > > thanks, > -Michael > > -- > Michael Friendly Email: friendly AT yorku DOT ca > Professor, Psychology Dept. > York University Voice: 416 736-5115 x66249 Fax: 416 736-5814 > 4700 Keele Street Web: http://www.datavis.ca > Toronto, ONT M3J 1P3 CANADA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting- > guide.html > and provide commented, minimal, self-contained, reproducible code.