-- |-- Module : Statistics.Resampling.Bootstrap-- Copyright : (c) 2009, 2011 Bryan O'Sullivan-- License : BSD3---- Maintainer : bos@serpentine.com-- Stability : experimental-- Portability : portable---- The bootstrap method for statistical inference.moduleStatistics.Resampling.Bootstrap(bootstrapBCA ,basicBootstrap -- * References-- $references)whereimportData.Vector.Generic((!))importqualifiedData.Vector.UnboxedasUimportqualifiedData.Vector.GenericasGimportStatistics.Distribution (cumulative ,quantile )importStatistics.Distribution.Normal importStatistics.Resampling (Bootstrap (..),jackknife )importStatistics.Sample (mean )importStatistics.Types (Sample ,CL ,Estimate ,ConfInt ,estimateFromInterval ,estimateFromErr ,CL ,significanceLevel )importStatistics.Function (gsort )importqualifiedStatistics.Resampling asRimportControl.Parallel.Strategies(parMap,rdeepseq)dataT ={-# UNPACK#-}!Double:< {-# UNPACK#-}!Doubleinfixl2:< -- | Bias-corrected accelerated (BCA) bootstrap. This adjusts for both-- bias and skewness in the resampled distribution.---- BCA algorithm is described in ch. 5 of Davison, Hinkley "Confidence-- intervals" in section 5.3 "Percentile method"bootstrapBCA ::CL Double-- ^ Confidence level->Sample -- ^ Full data sample->[(R.Estimator ,Bootstrap U.VectorDouble)]-- ^ Estimates obtained from resampled data and estimator used for-- this.->[Estimate ConfInt Double]bootstrapBCA :: CL Double
-> Sample
-> [(Estimator, Bootstrap Vector Double)]
-> [Estimate ConfInt Double]
bootstrapBCA CL Double
confidenceLevel Sample
sample [(Estimator, Bootstrap Vector Double)]
resampledData =Strategy (Estimate ConfInt Double)
-> ((Estimator, Bootstrap Vector Double)
 -> Estimate ConfInt Double)
-> [(Estimator, Bootstrap Vector Double)]
-> [Estimate ConfInt Double]
forall b a. Strategy b -> (a -> b) -> [a] -> [b]
parMapStrategy (Estimate ConfInt Double)
forall a. NFData a => Strategy a
rdeepseq(Estimator, Bootstrap Vector Double) -> Estimate ConfInt Double
forall {a}.
(Num a, Unbox a, Ord a) =>
(Estimator, Bootstrap Vector a) -> Estimate ConfInt a
e [(Estimator, Bootstrap Vector Double)]
resampledData wheree :: (Estimator, Bootstrap Vector a) -> Estimate ConfInt a
e (Estimator
est ,Bootstrap a
pt Vector a
resample )|Sample -> Int
forall a. Unbox a => Vector a -> Int
U.lengthSample
sample Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
1Bool -> Bool -> Bool
||Double -> Bool
forall a. RealFloat a => a -> Bool
isInfiniteDouble
bias =a -> (a, a) -> CL Double -> Estimate ConfInt a
forall a. a -> (a, a) -> CL Double -> Estimate ConfInt a
estimateFromErr a
pt (a
0,a
0)CL Double
confidenceLevel |Bool
otherwise=a -> (a, a) -> CL Double -> Estimate ConfInt a
forall a. Num a => a -> (a, a) -> CL Double -> Estimate ConfInt a
estimateFromInterval a
pt (Vector a
resample Vector a -> Int -> a
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
!Int
lo ,Vector a
resample Vector a -> Int -> a
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
!Int
hi )CL Double
confidenceLevel where-- Quantile estimates for given CLlo :: Int
lo =Int -> Int -> Int
forall a. Ord a => a -> a -> a
min(Int -> Int -> Int
forall a. Ord a => a -> a -> a
max(Double -> Int
cumn Double
a1 )Int
0)(Int
ni Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)wherea1 :: Double
a1 =Double
bias Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
b1 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/(Double
1Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
accel Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
b1 )b1 :: Double
b1 =Double
bias Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
z1 hi :: Int
hi =Int -> Int -> Int
forall a. Ord a => a -> a -> a
max(Int -> Int -> Int
forall a. Ord a => a -> a -> a
min(Double -> Int
cumn Double
a2 )(Int
ni Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1))Int
0wherea2 :: Double
a2 =Double
bias Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
b2 Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/(Double
1Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
accel Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
b2 )b2 :: Double
b2 =Double
bias Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
z1 -- Number of resamplesni :: Int
ni =Vector a -> Int
forall a. Unbox a => Vector a -> Int
U.lengthVector a
resample n :: Double
n =Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegralInt
ni -- Correctionsz1 :: Double
z1 =NormalDistribution -> Double -> Double
forall d. ContDistr d => d -> Double -> Double
quantile NormalDistribution
standard (CL Double -> Double
forall a. CL a -> a
significanceLevel CL Double
confidenceLevel Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
2)cumn :: Double -> Int
cumn =Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round(Double -> Int) -> (Double -> Double) -> Double -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
n )(Double -> Double) -> (Double -> Double) -> Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
.NormalDistribution -> Double -> Double
forall d. Distribution d => d -> Double -> Double
cumulative NormalDistribution
standard bias :: Double
bias =NormalDistribution -> Double -> Double
forall d. ContDistr d => d -> Double -> Double
quantile NormalDistribution
standard (Double
probN Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
n )whereprobN :: Double
probN =Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral(Int -> Double) -> (Vector a -> Int) -> Vector a -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Vector a -> Int
forall a. Unbox a => Vector a -> Int
U.length(Vector a -> Int) -> (Vector a -> Vector a) -> Vector a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(a -> Bool) -> Vector a -> Vector a
forall a. Unbox a => (a -> Bool) -> Vector a -> Vector a
U.filter(a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<a
pt )(Vector a -> Double) -> Vector a -> Double
forall a b. (a -> b) -> a -> b
$Vector a
resample accel :: Double
accel =Double
sumCubes Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/(Double
6Double -> Double -> Double
forall a. Num a => a -> a -> a
*(Double
sumSquares Double -> Double -> Double
forall a. Floating a => a -> a -> a
**Double
1.5))where(Double
sumSquares :< Double
sumCubes )=(T -> Double -> T) -> T -> Sample -> T
forall b a. Unbox b => (a -> b -> a) -> a -> Vector b -> a
U.foldl'T -> Double -> T
f (Double
0Double -> Double -> T
:< Double
0)Sample
jack f :: T -> Double -> T
f (Double
s :< Double
c )Double
j =Double
s Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
d2 Double -> Double -> T
:< Double
c Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
d2 Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
d whered :: Double
d =Double
jackMean Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
j d2 :: Double
d2 =Double
d Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
d jackMean :: Double
jackMean =Sample -> Double
forall (v :: * -> *). Vector v Double => v Double -> Double
mean Sample
jack jack :: Sample
jack =Estimator -> Sample -> Sample
jackknife Estimator
est Sample
sample -- | Basic bootstrap. This method simply uses empirical quantiles for-- confidence interval.basicBootstrap ::(G.Vectorv a ,Orda ,Numa )=>CL Double-- ^ Confidence vector->Bootstrap v a -- ^ Estimate from full sample and vector of-- estimates obtained from resamples->Estimate ConfInt a {-# INLINEbasicBootstrap #-}basicBootstrap :: forall (v :: * -> *) a.
(Vector v a, Ord a, Num a) =>
CL Double -> Bootstrap v a -> Estimate ConfInt a
basicBootstrap CL Double
cl (Bootstrap a
e v a
ests )=a -> (a, a) -> CL Double -> Estimate ConfInt a
forall a. Num a => a -> (a, a) -> CL Double -> Estimate ConfInt a
estimateFromInterval a
e (v a
sorted v a -> Int -> a
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
!Int
lo ,v a
sorted v a -> Int -> a
forall (v :: * -> *) a.
(HasCallStack, Vector v a) =>
v a -> Int -> a
!Int
hi )CL Double
cl wheresorted :: v a
sorted =v a -> v a
forall e (v :: * -> *). (Ord e, Vector v e) => v e -> v e
gsort v a
ests n :: Double
n =Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral(Int -> Double) -> Int -> Double
forall a b. (a -> b) -> a -> b
$v a -> Int
forall (v :: * -> *) a. Vector v a => v a -> Int
G.lengthv a
ests c :: Double
c =Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
*(CL Double -> Double
forall a. CL a -> a
significanceLevel CL Double
cl Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/Double
2)-- FIXME: can we have better estimates of quantiles in case when p-- is not multiple of 1/N---- FIXME: we could have undercoverage herelo :: Int
lo =Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
roundDouble
c hi :: Int
hi =Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate(Double
n Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
c )-- $references---- * Davison, A.C; Hinkley, D.V. (1997) Bootstrap methods and their-- application. <http://statwww.epfl.ch/davison/BMA/>

AltStyle によって変換されたページ (->オリジナル) /