@@ -37,6 +37,10 @@ function default_bandwidth(data::RealVector, alpha::Float64 = 0.9)
37
37
return alpha * width * ndata^ (- 0.2 )
38
38
end
39
39
40
+ function default_weights (data:: RealVector )
41
+ UniformWeights (length (data))
42
+ end
43
+
40
44
41
45
# Roughly based on:
42
46
# B. W. Silverman (1982) "Algorithm AS 176: Kernel Density Estimation Using
@@ -79,7 +83,7 @@ typealias Weights Union{UniformWeights, RealVector, WeightVec}
79
83
80
84
81
85
# tabulate data for kde
82
- function tabulate (data:: RealVector , weights :: Weights , midpoints :: Range )
86
+ function tabulate (data:: RealVector , midpoints :: Range , weights :: Weights = default_weights (data) )
83
87
npoints = length (midpoints)
84
88
s = step (midpoints)
85
89
@@ -101,10 +105,6 @@ function tabulate(data::RealVector, weights::Weights, midpoints::Range)
101
105
UnivariateKDE (midpoints, grid)
102
106
end
103
107
104
- function tabulate (data:: RealVector , midpoints:: Range )
105
- tabulate (data, UniformWeights (length (data)), midpoints)
106
- end
107
-
108
108
# convolve raw KDE with kernel
109
109
# TODO : use in-place fft
110
110
function conv (k:: UnivariateKDE , dist:: UnivariateDistribution )
@@ -135,26 +135,26 @@ end
135
135
136
136
# main kde interface methods
137
137
function kde (data:: RealVector , weights:: Weights , midpoints:: Range , dist:: UnivariateDistribution )
138
- k = tabulate (data, weights, midpoints )
138
+ k = tabulate (data, midpoints, weights )
139
139
conv (k,dist)
140
140
end
141
141
142
142
function kde (data:: RealVector , dist:: UnivariateDistribution ;
143
- boundary:: (@compat Tuple{Real,Real}) = kde_boundary (data,std (dist)), npoints:: Int = 2048 , weights= UniformWeights ( length ( data) ))
143
+ boundary:: (@compat Tuple{Real,Real}) = kde_boundary (data,std (dist)), npoints:: Int = 2048 , weights= default_weights ( data))
144
144
145
145
midpoints = kde_range (boundary,npoints)
146
146
kde (data,weights,midpoints,dist)
147
147
end
148
148
149
149
function kde (data:: RealVector , midpoints:: Range ;
150
- bandwidth= default_bandwidth (data), kernel= Normal, weights= UniformWeights ( length ( data) ))
150
+ bandwidth= default_bandwidth (data), kernel= Normal, weights= default_weights ( data))
151
151
bandwidth > 0.0 || error (" Bandwidth must be positive" )
152
152
dist = kernel_dist (kernel,bandwidth)
153
153
kde (data,weights,midpoints,dist)
154
154
end
155
155
156
156
function kde (data:: RealVector ; bandwidth= default_bandwidth (data), kernel= Normal,
157
- npoints:: Int = 2048 , boundary:: (@compat Tuple{Real,Real}) = kde_boundary (data,bandwidth), weights= UniformWeights ( length ( data) ))
157
+ npoints:: Int = 2048 , boundary:: (@compat Tuple{Real,Real}) = kde_boundary (data,bandwidth), weights= default_weights ( data))
158
158
bandwidth > 0.0 || error (" Bandwidth must be positive" )
159
159
dist = kernel_dist (kernel,bandwidth)
160
160
kde (data,dist;boundary= boundary,npoints= npoints,weights= weights)
@@ -167,10 +167,11 @@ end
167
167
168
168
function kde_lscv (data:: RealVector , midpoints:: Range ;
169
169
kernel= Normal,
170
- bandwidth_range:: (@compat Tuple{Real,Real}) = (h= default_bandwidth (data); (0.25 * h,1.5 * h)))
170
+ bandwidth_range:: (@compat Tuple{Real,Real}) = (h= default_bandwidth (data); (0.25 * h,1.5 * h)),
171
+ weights= default_weights (data))
171
172
172
173
ndata = length (data)
173
- k = tabulate (data, midpoints)
174
+ k = tabulate (data, midpoints, weights )
174
175
175
176
# the ft here is K/ba*sqrt(2pi) * u(s), it is K times the Yl in Silverman's book
176
177
K = length (k. density)
@@ -209,8 +210,9 @@ function kde_lscv(data::RealVector;
209
210
boundary:: (@compat Tuple{Real,Real}) = kde_boundary (data,default_bandwidth (data)),
210
211
npoints:: Int = 2048 ,
211
212
kernel= Normal,
212
- bandwidth_range:: (@compat Tuple{Real,Real}) = (h= default_bandwidth (data); (0.25 * h,1.5 * h)))
213
+ bandwidth_range:: (@compat Tuple{Real,Real}) = (h= default_bandwidth (data); (0.25 * h,1.5 * h)),
214
+ weights:: Weights = default_weights (data))
213
215
214
216
midpoints = kde_range (boundary,npoints)
215
- kde_lscv (data,midpoints; kernel= kernel, bandwidth_range= bandwidth_range)
217
+ kde_lscv (data,midpoints; kernel= kernel, bandwidth_range= bandwidth_range, weights = weights )
216
218
end
0 commit comments