@@ -2304,339 +2304,3 @@ test(6015.907, frolladapt(c(1L,3L,2L), 2L), error="be sorted, have no duplicates
23042304test(6015.908, frolladapt(c(1L,2L,2L), 2L), error="be sorted, have no duplicates, have no NAs")
23052305test(6015.909, frolladapt(c(1L,2L,NA_integer_), 2L), error="be sorted, have no duplicates, have no NAs") ## loop that checks for sorted will detect NAs as well, except for first element
23062306test(6015.910, frolladapt(c(NA_integer_,1L,2L), 2L), error="be sorted, have no duplicates, have no NAs") ## first NA is detected by extra check
2307-
2308- ## batch validation
2309- set.seed(108)
2310- makeNA = function(x, ratio=0.1, nf=FALSE) {
2311- n = as.integer(length(x) * ratio)
2312- id = sample(length(x), n)
2313- if (!nf) {
2314- x[id] = NA
2315- } else {
2316- x[id[1:(n/4)]] = NA
2317- x[id[(n/4+1):(n/2)]] = NaN
2318- x[id[(n/2+1):(3*n/4)]] = -Inf
2319- x[id[(3*n/4+1):n]] = +Inf
2320- }
2321- x
2322- }
2323- ## against base to verify exactness of non-finite values, not handled in zoo
2324- rollfun = function(x, n, FUN, fill=NA_real_, na.rm=FALSE, nf.rm=FALSE, partial=FALSE) {
2325- ans = rep(fill, nx<-length(x))
2326- f = match.fun(FUN)
2327- if (nf.rm) x[is.infinite(x)] = NA_real_
2328- for (i in seq_along(x)) {
2329- ans[i] = if (n==0)
2330- f(x[integer()], na.rm=na.rm)
2331- else if (i >= n)
2332- f(x[(i-n+1L):i], na.rm=na.rm)
2333- else if (partial)
2334- f(x[max((i-n+1), 1L):i], na.rm=na.rm)
2335- else
2336- as.double(fill)
2337- }
2338- ans
2339- }
2340- base_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2341- num.step = 0.0001
2342- for (fun in funs) {
2343- for (na.rm in c(FALSE, TRUE)) {
2344- for (fill in c(NA_real_, 0)) {
2345- for (partial in c(FALSE,TRUE)) {
2346- for (has.nf in c(NA,TRUE,FALSE)) {
2347- if (identical(has.nf, FALSE)) {
2348- if (na.rm)
2349- next ## errors "not make sense"
2350- if (any(!is.finite(x)))
2351- next ## do not test warnings (mean, sum) or incorrect expect results (max)
2352- }
2353- for (algo in algos) {
2354- num <<- num + num.step
2355- eval(substitute( # so we can have values displayed in output/log rather than variables
2356- test(.num, ignore.warning="no non-missing arguments",
2357- rollfun(x, n, FUN=.fun, fill=.fill, na.rm=.na.rm, partial=.partial),
2358- froll(.fun, x, n, fill=.fill, na.rm=.na.rm, algo=.algo, partial=.partial, has.nf=.has.nf)),
2359- list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .algo=algo, .partial=partial, .has.nf=has.nf)
2360- ))
2361- }
2362- }
2363- num <<- num + num.step
2364- eval(substitute( # so we can have values displayed in output/log rather than variables
2365- test(.num, ignore.warning="no non-missing arguments",
2366- frollapply(x, n, FUN=match.fun(.fun), fill=.fill, na.rm=.na.rm, partial=.partial),
2367- froll(.fun, x, n, fill=.fill, na.rm=.na.rm, partial=.partial)),
2368- list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .partial=partial)
2369- ))
2370- }
2371- }
2372- }
2373- }
2374- }
2375- num = 7000.0
2376- x = rnorm(1e3); n = 50
2377- base_compare(x, n)
2378- x = rnorm(1e3+1); n = 50 ## uneven len
2379- base_compare(x, n)
2380- x = rnorm(1e3); n = 51 ## uneven window
2381- base_compare(x, n)
2382- x = rnorm(1e3+1); n = 51
2383- base_compare(x, n)
2384- x = sort(rnorm(1e3)); n = 50 ## inc
2385- base_compare(x, n)
2386- x = sort(rnorm(1e3+1)); n = 50
2387- base_compare(x, n)
2388- x = sort(rnorm(1e3)); n = 51
2389- base_compare(x, n)
2390- x = sort(rnorm(1e3+1)); n = 51
2391- base_compare(x, n)
2392- x = rev(sort(rnorm(1e3))); n = 50 ## desc
2393- base_compare(x, n)
2394- x = rev(sort(rnorm(1e3+1))); n = 50
2395- base_compare(x, n)
2396- x = rev(sort(rnorm(1e3))); n = 51
2397- base_compare(x, n)
2398- x = rev(sort(rnorm(1e3+1))); n = 51
2399- base_compare(x, n)
2400- x = rep(rnorm(1), 1e3); n = 50 ## const
2401- base_compare(x, n)
2402- x = rep(rnorm(1), 1e3+1); n = 50
2403- base_compare(x, n)
2404- x = rep(rnorm(1), 1e3); n = 51
2405- base_compare(x, n)
2406- x = rep(rnorm(1), 1e3+1); n = 51
2407- base_compare(x, n)
2408- num = 7100.0
2409- ## random NA non-finite
2410- x = makeNA(rnorm(1e3), nf=TRUE); n = 50
2411- base_compare(x, n)
2412- x = makeNA(rnorm(1e3+1), nf=TRUE); n = 50
2413- base_compare(x, n)
2414- x = makeNA(rnorm(1e3), nf=TRUE); n = 51
2415- base_compare(x, n)
2416- x = makeNA(rnorm(1e3+1), nf=TRUE); n = 51
2417- base_compare(x, n)
2418- x = makeNA(rnorm(1e3), nf=TRUE); n = 0
2419- base_compare(x, n)
2420-
2421- #### against zoo
2422- if (requireNamespace("zoo", quietly=TRUE)) {
2423- drollapply = function(...) as.double(zoo::rollapply(...)) # rollapply is not consistent in data type of answer, force to double
2424- zoo_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2425- num.step = 0.0001
2426- #### fun, align, na.rm, fill, algo, partial
2427- for (fun in funs) {
2428- for (align in c("right","center","left")) {
2429- for (na.rm in c(FALSE, TRUE)) {
2430- for (fill in c(NA_real_, 0)) {
2431- for (partial in c(FALSE,TRUE)) {
2432- if (partial && align=="center")
2433- next ## not implemented
2434- for (has.nf in c(NA,TRUE,FALSE)) {
2435- if (identical(has.nf, FALSE)) {
2436- if (na.rm)
2437- next ## errors "not make sense"
2438- if (any(!is.finite(x)))
2439- next ## do not test warnings (mean, sum, prod) or incorrect expect results (max, min, median)
2440- }
2441- for (algo in algos) {
2442- num <<- num + num.step
2443- eval(substitute( # so we can have values displayed in output/log rather than variables
2444- test(.num, ignore.warning="no non-missing arguments",
2445- drollapply(x, n, FUN=.fun, fill=.fill, align=.align, na.rm=.na.rm, partial=.partial),
2446- froll(.fun, x, n, align=.align, fill=.fill, na.rm=.na.rm, algo=.algo, partial=.partial, has.nf=.has.nf)),
2447- list(.num=num, .fun=fun, .align=align, .fill=fill, .na.rm=na.rm, .algo=algo, .partial=partial, .has.nf=has.nf)
2448- ))
2449- }
2450- }
2451- num <<- num + num.step
2452- eval(substitute( # so we can have values displayed in output/log rather than variables
2453- test(.num, ignore.warning="no non-missing arguments",
2454- frollapply(x, n, FUN=.fun, fill=.fill, align=.align, na.rm=.na.rm, partial=.partial),
2455- froll(.fun, x, n, align=.align, fill=.fill, na.rm=.na.rm, partial=.partial)),
2456- list(.num=num, .fun=fun, .align=align, .fill=fill, .na.rm=na.rm, .partial=partial)
2457- ))
2458- }
2459- }
2460- }
2461- }
2462- }
2463- }
2464- num = 7200.0
2465- ## no NA
2466- x = rnorm(1e3); n = 50 # x even, n even
2467- zoo_compare(x, n)
2468- x = rnorm(1e3+1); n = 50 # x odd, n even
2469- zoo_compare(x, n)
2470- x = rnorm(1e3); n = 51 # x even, n odd
2471- zoo_compare(x, n)
2472- x = rnorm(1e3+1); n = 51 # x odd, n odd
2473- zoo_compare(x, n)
2474- ## leading and trailing NAs
2475- x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = 50
2476- zoo_compare(x, n)
2477- x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = 50
2478- zoo_compare(x, n)
2479- x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = 51
2480- zoo_compare(x, n)
2481- x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = 51
2482- zoo_compare(x, n)
2483- ## random NA
2484- x = makeNA(rnorm(1e3)); n = 50
2485- zoo_compare(x, n)
2486- x = makeNA(rnorm(1e3+1)); n = 50
2487- zoo_compare(x, n)
2488- x = makeNA(rnorm(1e3)); n = 51
2489- zoo_compare(x, n)
2490- x = makeNA(rnorm(1e3+1)); n = 51
2491- zoo_compare(x, n)
2492- }
2493- #### adaptive moving average compare
2494- arollfun = function(FUN, x, n, na.rm=FALSE, align=c("right","left"), fill=NA, nf.rm=FALSE, partial=FALSE) {
2495- # adaptive moving average in R
2496- stopifnot((nx<-length(x))==length(n))
2497- align = match.arg(align)
2498- ans = rep(fill, nx)
2499- if (nf.rm) x[is.infinite(x)] = NA_real_
2500- f = match.fun(FUN)
2501- if (align=="right") {
2502- for (i in seq_along(x)) {
2503- if (n[i] == 0)
2504- ans[i] = f(x[integer()], na.rm=na.rm)
2505- else if (i >= n[i])
2506- ans[i] = f(x[(i-n[i]+1L):i], na.rm=na.rm)
2507- else if (partial)
2508- ans[i] = f(x[1L:i], na.rm=na.rm)
2509- }
2510- } else {
2511- for (i in seq_along(x)) {
2512- if (n[i] == 0)
2513- ans[i] = f(x[integer()], na.rm=na.rm)
2514- else if (i <= nx-n[i]+1)
2515- ans[i] = f(x[i:(i+n[i]-1L)], na.rm=na.rm)
2516- else if (partial)
2517- ans[i] = f(x[i:length(x)], na.rm=na.rm)
2518- }
2519- }
2520- ans
2521- }
2522- afun_compare = function(x, n, funs=c("mean","sum","max","min","prod","median","var","sd"), algos=c("fast","exact")) {
2523- num.step = 0.0001
2524- #### fun, align, na.rm, fill, algo
2525- for (fun in funs) {
2526- for (align in c("right","left")) {
2527- for (na.rm in c(FALSE, TRUE)) {
2528- for (fill in c(NA_real_, 0)) {
2529- for (partial in c(FALSE, TRUE)) {
2530- for (has.nf in c(NA, TRUE, FALSE)) {
2531- if (identical(has.nf, FALSE)) {
2532- if (na.rm) {
2533- next
2534- } ## errors "not make sense"
2535- if (any(!is.finite(x))) {
2536- next
2537- } ## do not test warnings (mean, sum, prod) or incorrect expect results (max, min, median)
2538- }
2539- for (algo in algos) {
2540- num <<- num + num.step
2541- eval(substitute(
2542- test(.num,
2543- ignore.warning = "no non-missing arguments",
2544- arollfun(.fun, x, n, fill = .fill, na.rm = .na.rm, align = .align, partial=.partial),
2545- froll(.fun, x, n, fill=.fill, na.rm=.na.rm, algo=.algo, adaptive=TRUE, align=.align, has.nf=.has.nf, partial=.partial)
2546- ),
2547- list(.num = num, .fun = fun, .fill = fill, .na.rm = na.rm, .algo = algo, .align = align, .partial=partial, .has.nf = has.nf)
2548- ))
2549- }
2550- }
2551- }
2552- num <<- num + num.step
2553- eval(substitute(
2554- test(.num, ignore.warning="no non-missing arguments",
2555- frollapply(x, n, FUN=match.fun(.fun), fill=.fill, na.rm=.na.rm, adaptive=TRUE, align=.align),
2556- froll(.fun, x, n, fill=.fill, na.rm=.na.rm, adaptive=TRUE, align=.align)),
2557- list(.num=num, .fun=fun, .fill=fill, .na.rm=na.rm, .align=align)
2558- ))
2559- }
2560- }
2561- }
2562- }
2563- }
2564- num = 7300.0
2565- x = rnorm(1e3); n = sample(50, length(x), TRUE)
2566- afun_compare(x, n)
2567- x = rnorm(1e3+1); n = sample(50, length(x), TRUE) ## uneven len
2568- afun_compare(x, n)
2569- x = rnorm(1e3); n = sample(51, length(x), TRUE) ## uneven window
2570- afun_compare(x, n)
2571- x = rnorm(1e3+1); n = sample(51, length(x), TRUE)
2572- afun_compare(x, n)
2573- x = sort(rnorm(1e3)); n = sample(50, length(x), TRUE) ## inc
2574- afun_compare(x, n)
2575- x = sort(rnorm(1e3+1)); n = sample(50, length(x), TRUE)
2576- afun_compare(x, n)
2577- x = sort(rnorm(1e3)); n = sample(51, length(x), TRUE)
2578- afun_compare(x, n)
2579- x = sort(rnorm(1e3+1)); n = sample(51, length(x), TRUE)
2580- afun_compare(x, n)
2581- x = rev(sort(rnorm(1e3))); n = sample(50, length(x), TRUE) ## desc
2582- afun_compare(x, n)
2583- x = rev(sort(rnorm(1e3+1))); n = sample(50, length(x), TRUE)
2584- afun_compare(x, n)
2585- x = rev(sort(rnorm(1e3))); n = sample(51, length(x), TRUE)
2586- afun_compare(x, n)
2587- x = rev(sort(rnorm(1e3+1))); n = sample(51, length(x), TRUE)
2588- afun_compare(x, n)
2589- x = rep(rnorm(1), 1e3); n = sample(50, length(x), TRUE) ## const
2590- afun_compare(x, n)
2591- x = rep(rnorm(1), 1e3+1); n = sample(50, length(x), TRUE)
2592- afun_compare(x, n)
2593- x = rep(rnorm(1), 1e3); n = sample(51, length(x), TRUE)
2594- afun_compare(x, n)
2595- x = rep(rnorm(1), 1e3+1); n = sample(51, length(x), TRUE)
2596- afun_compare(x, n)
2597- num = 7400.0
2598- #### no NA
2599- x = rnorm(1e3); n = sample(50, length(x), TRUE) # x even, n even
2600- afun_compare(x, n)
2601- x = rnorm(1e3+1); n = sample(50, length(x), TRUE) # x odd, n even
2602- afun_compare(x, n)
2603- x = rnorm(1e3); n = sample(51, length(x), TRUE) # x even, n odd
2604- afun_compare(x, n)
2605- x = rnorm(1e3+1); n = sample(51, length(x), TRUE) # x odd, n odd
2606- afun_compare(x, n)
2607- x = rnorm(1e3); n = sample(0:49, length(x), TRUE) # x even, n even
2608- afun_compare(x, n)
2609- #### leading and trailing NAs
2610- x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(50, length(x), TRUE)
2611- afun_compare(x, n)
2612- x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = sample(50, length(x), TRUE)
2613- afun_compare(x, n)
2614- x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(51, length(x), TRUE)
2615- afun_compare(x, n)
2616- x = c(rep(NA, 60), rnorm(1e3+1), rep(NA, 60)); n = sample(51, length(x), TRUE)
2617- afun_compare(x, n)
2618- x = c(rep(NA, 60), rnorm(1e3), rep(NA, 60)); n = sample(0:49, length(x), TRUE)
2619- afun_compare(x, n)
2620- #### random NA
2621- x = makeNA(rnorm(1e3)); n = sample(50, length(x), TRUE)
2622- afun_compare(x, n)
2623- x = makeNA(rnorm(1e3+1)); n = sample(50, length(x), TRUE)
2624- afun_compare(x, n)
2625- x = makeNA(rnorm(1e3)); n = sample(51, length(x), TRUE)
2626- afun_compare(x, n)
2627- x = makeNA(rnorm(1e3+1)); n = sample(51, length(x), TRUE)
2628- afun_compare(x, n)
2629- x = makeNA(rnorm(1e3)); n = sample(0:49, length(x), TRUE)
2630- afun_compare(x, n)
2631- #### random NA non-finites
2632- x = makeNA(rnorm(1e3), nf=TRUE); n = sample(50, length(x), TRUE)
2633- afun_compare(x, n)
2634- x = makeNA(rnorm(1e3+1), nf=TRUE); n = sample(50, length(x), TRUE)
2635- afun_compare(x, n)
2636- x = makeNA(rnorm(1e3), nf=TRUE); n = sample(51, length(x), TRUE)
2637- afun_compare(x, n)
2638- x = makeNA(rnorm(1e3+1), nf=TRUE); n = sample(51, length(x), TRUE)
2639- afun_compare(x, n)
2640- x = makeNA(rnorm(1e3), nf=TRUE); n = sample(0:49, length(x), TRUE)
2641- afun_compare(x, n)
2642- rm(num)
0 commit comments