67 MODULE PROCEDURE boxcox_sp, boxcox_dp
109 MODULE PROCEDURE invboxcox_0d_sp, invboxcox_0d_dp, invboxcox_1d_sp, invboxcox_1d_dp
122 FUNCTION boxcox_sp(x, lmbda, mask)
126 REAL(sp),
DIMENSION(:),
INTENT(in) :: x
127 REAL(sp),
INTENT(in) :: lmbda
128 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: mask
129 REAL(sp),
DIMENSION(size(x)) :: boxcox_sp
131 LOGICAL,
DIMENSION(size(x)) :: maske
135 if (
present(mask))
then
136 if (
size(mask) /=
size(x)) stop
'Error boxcox_sp: size(mask) /= size(x)'
139 if (any((
le(x, 0.0_sp)) .and. maske)) stop
'Error boxcox_sp: x <= 0'
140 if (abs(lmbda) < tiny(0.0_sp))
then
147 lmbda1 = 1.0_sp / lmbda
148 boxcox_sp = merge((exp(lmbda * log(x)) - 1.0_sp) * lmbda1, x, maske)
151 END FUNCTION boxcox_sp
154 FUNCTION boxcox_dp(x, lmbda, mask)
158 REAL(dp),
DIMENSION(:),
INTENT(in) :: x
159 REAL(dp),
INTENT(in) :: lmbda
160 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: mask
161 REAL(dp),
DIMENSION(size(x)) :: boxcox_dp
163 LOGICAL,
DIMENSION(size(x)) :: maske
167 if (
present(mask))
then
168 if (
size(mask) /=
size(x)) stop
'Error boxcox_dp: size(mask) /= size(x)'
171 if (any((
le(x, 0.0_dp)) .and. maske))
then
172 stop
'Error boxcox_dp: x <= 0'
174 if (abs(lmbda) < tiny(0.0_dp))
then
181 lmbda1 = 1.0_dp / lmbda
182 boxcox_dp = merge((exp(lmbda * log(x)) - 1.0_dp) * lmbda1, x, maske)
185 END FUNCTION boxcox_dp
189 FUNCTION invboxcox_1d_sp(x, lmbda, mask)
193 REAL(sp),
DIMENSION(:),
INTENT(in) :: x
194 REAL(sp),
INTENT(in) :: lmbda
195 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: mask
196 REAL(sp),
DIMENSION(size(x)) :: invboxcox_1d_sp
198 LOGICAL,
DIMENSION(size(x)) :: maske
200 REAL(sp),
DIMENSION(size(x)) :: temp
203 if (
present(mask))
then
204 if (
size(mask) /=
size(x)) stop
'Error invboxcox_1d_sp: size(mask) /= size(x)'
207 if (abs(lmbda) < tiny(0.0_sp))
then
209 invboxcox_1d_sp = exp(x)
214 lmbda1 = 1.0_sp / lmbda
215 temp = lmbda * x + 1.0_sp
216 where (temp > 0.0_sp)
217 temp = exp(lmbda1 * log(temp))
221 invboxcox_1d_sp = merge(temp, x, maske)
224 END FUNCTION invboxcox_1d_sp
226 FUNCTION invboxcox_1d_dp(x, lmbda, mask)
230 REAL(dp),
DIMENSION(:),
INTENT(in) :: x
231 REAL(dp),
INTENT(in) :: lmbda
232 LOGICAL,
DIMENSION(:),
INTENT(in),
OPTIONAL :: mask
233 REAL(dp),
DIMENSION(size(x)) :: invboxcox_1d_dp
235 LOGICAL,
DIMENSION(size(x)) :: maske
237 REAL(dp),
DIMENSION(size(x)) :: temp
240 if (
present(mask))
then
241 if (
size(mask) /=
size(x)) stop
'Error invboxcox_1d_dp: size(mask) /= size(x)'
244 if (abs(lmbda) < tiny(0.0_dp))
then
246 invboxcox_1d_dp = exp(x)
251 lmbda1 = 1.0_dp / lmbda
252 temp = lmbda * x + 1.0_dp
253 where (temp > 0.0_dp)
254 temp = exp(lmbda1 * log(temp))
258 invboxcox_1d_dp = merge(temp, x, maske)
261 END FUNCTION invboxcox_1d_dp
263 FUNCTION invboxcox_0d_sp(x, lmbda)
267 REAL(sp),
INTENT(in) :: x
268 REAL(sp),
INTENT(in) :: lmbda
269 REAL(sp) :: invboxcox_0d_sp
274 if (abs(lmbda) < tiny(0.0_sp))
then
275 invboxcox_0d_sp = exp(x)
277 lmbda1 = 1.0_sp / lmbda
278 temp = lmbda * x + 1.0_sp
279 if (temp > 0.0_sp)
then
280 temp = exp(lmbda1 * log(temp))
284 invboxcox_0d_sp = temp
287 END FUNCTION invboxcox_0d_sp
289 FUNCTION invboxcox_0d_dp(x, lmbda)
293 REAL(dp),
INTENT(in) :: x
294 REAL(dp),
INTENT(in) :: lmbda
295 REAL(dp) :: invboxcox_0d_dp
300 if (abs(lmbda) < tiny(0.0_dp))
then
301 invboxcox_0d_dp = exp(x)
303 lmbda1 = 1.0_dp / lmbda
304 temp = lmbda * x + 1.0_dp
305 if (temp > 0.0_dp)
then
306 temp = exp(lmbda1 * log(temp))
310 invboxcox_0d_dp = temp
313 END FUNCTION invboxcox_0d_dp
Transform a positive dataset with a Box-Cox power transformation.
Back-transformation of Box-Cox-transformed data.
Comparison of real values: a <= b.
Box-Cox transformation of data.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter dp
Double Precision Real Kind.
General utilities for the CHS library.