Skip to contents

Detects potential sensor drift by comparing rolling window statistics (mean or standard deviation) to their long-term baseline. Returns a logical matrix indicating time points where the rolling statistic deviates beyond a threshold.

Usage

drift_detect(data, cols = NULL, window = 30, threshold = 3,
             method = c("mean", "sd"), group = NULL,
             date_col = NULL, verbose = FALSE)

Arguments

data

A data frame, matrix, or numeric vector.

cols

Column indices or names of numeric variables. If NULL, all numeric columns are used.

window

Window size for rolling statistics.

threshold

Threshold in units of standard deviation. Values with absolute z-score above this are flagged as drift.

method

Rolling statistic to use: "mean" or "sd".

group

Optional grouping column for group-wise detection.

date_col

Optional time column (not required for calculation).

verbose

Logical; if TRUE, prints progress message.

Value

A logical matrix with rows corresponding to observations and columns to the selected variables. TRUE indicates suspected drift.

Examples

drift_detect(data[1:500, c(1, 4, 17:19)], cols = 3:5, window = 50, threshold = 3)
#>         3.98  4.47  5.01
#>   [1,]    NA    NA    NA
#>   [2,]    NA    NA    NA
#>   [3,]    NA    NA    NA
#>   [4,] FALSE FALSE FALSE
#>   [5,] FALSE FALSE FALSE
#>   [6,] FALSE FALSE FALSE
#>   [7,] FALSE FALSE FALSE
#>   [8,] FALSE FALSE FALSE
#>   [9,] FALSE FALSE FALSE
#>  [10,] FALSE FALSE FALSE
#>  [11,] FALSE FALSE FALSE
#>  [12,] FALSE FALSE FALSE
#>  [13,] FALSE FALSE FALSE
#>  [14,] FALSE FALSE FALSE
#>  [15,] FALSE FALSE FALSE
#>  [16,] FALSE FALSE FALSE
#>  [17,] FALSE FALSE FALSE
#>  [18,] FALSE FALSE FALSE
#>  [19,] FALSE FALSE FALSE
#>  [20,] FALSE FALSE FALSE
#>  [21,] FALSE FALSE FALSE
#>  [22,] FALSE FALSE FALSE
#>  [23,] FALSE FALSE FALSE
#>  [24,] FALSE FALSE FALSE
#>  [25,] FALSE FALSE FALSE
#>  [26,] FALSE FALSE FALSE
#>  [27,] FALSE FALSE FALSE
#>  [28,] FALSE FALSE FALSE
#>  [29,] FALSE FALSE FALSE
#>  [30,] FALSE FALSE FALSE
#>  [31,] FALSE FALSE FALSE
#>  [32,] FALSE FALSE FALSE
#>  [33,] FALSE FALSE FALSE
#>  [34,] FALSE FALSE FALSE
#>  [35,] FALSE FALSE FALSE
#>  [36,] FALSE FALSE FALSE
#>  [37,] FALSE FALSE FALSE
#>  [38,] FALSE FALSE FALSE
#>  [39,] FALSE FALSE FALSE
#>  [40,] FALSE FALSE FALSE
#>  [41,] FALSE FALSE FALSE
#>  [42,] FALSE FALSE FALSE
#>  [43,] FALSE FALSE FALSE
#>  [44,] FALSE FALSE FALSE
#>  [45,] FALSE FALSE FALSE
#>  [46,] FALSE FALSE FALSE
#>  [47,] FALSE FALSE FALSE
#>  [48,] FALSE FALSE FALSE
#>  [49,] FALSE FALSE FALSE
#>  [50,] FALSE FALSE FALSE
#>  [51,] FALSE FALSE FALSE
#>  [52,] FALSE FALSE FALSE
#>  [53,] FALSE FALSE FALSE
#>  [54,] FALSE FALSE FALSE
#>  [55,] FALSE FALSE FALSE
#>  [56,] FALSE FALSE FALSE
#>  [57,] FALSE FALSE FALSE
#>  [58,] FALSE FALSE FALSE
#>  [59,] FALSE FALSE FALSE
#>  [60,] FALSE FALSE FALSE
#>  [61,] FALSE FALSE FALSE
#>  [62,] FALSE FALSE FALSE
#>  [63,] FALSE FALSE FALSE
#>  [64,] FALSE FALSE FALSE
#>  [65,] FALSE FALSE FALSE
#>  [66,] FALSE FALSE FALSE
#>  [67,] FALSE FALSE FALSE
#>  [68,] FALSE FALSE FALSE
#>  [69,] FALSE FALSE FALSE
#>  [70,] FALSE FALSE FALSE
#>  [71,] FALSE FALSE FALSE
#>  [72,] FALSE FALSE FALSE
#>  [73,] FALSE FALSE FALSE
#>  [74,] FALSE FALSE FALSE
#>  [75,] FALSE FALSE FALSE
#>  [76,] FALSE FALSE FALSE
#>  [77,] FALSE FALSE FALSE
#>  [78,] FALSE FALSE FALSE
#>  [79,] FALSE FALSE FALSE
#>  [80,] FALSE FALSE FALSE
#>  [81,] FALSE FALSE FALSE
#>  [82,] FALSE FALSE FALSE
#>  [83,] FALSE FALSE FALSE
#>  [84,] FALSE FALSE FALSE
#>  [85,] FALSE FALSE FALSE
#>  [86,] FALSE FALSE FALSE
#>  [87,] FALSE FALSE FALSE
#>  [88,] FALSE FALSE FALSE
#>  [89,] FALSE FALSE FALSE
#>  [90,] FALSE FALSE FALSE
#>  [91,] FALSE FALSE FALSE
#>  [92,] FALSE FALSE FALSE
#>  [93,] FALSE FALSE FALSE
#>  [94,] FALSE FALSE FALSE
#>  [95,] FALSE FALSE FALSE
#>  [96,] FALSE FALSE FALSE
#>  [97,] FALSE FALSE FALSE
#>  [98,] FALSE FALSE FALSE
#>  [99,] FALSE FALSE FALSE
#> [100,] FALSE FALSE FALSE
#> [101,] FALSE FALSE FALSE
#> [102,] FALSE FALSE FALSE
#> [103,] FALSE FALSE FALSE
#> [104,] FALSE FALSE FALSE
#> [105,] FALSE FALSE FALSE
#> [106,] FALSE FALSE FALSE
#> [107,] FALSE FALSE FALSE
#> [108,] FALSE FALSE FALSE
#> [109,] FALSE FALSE FALSE
#> [110,] FALSE FALSE FALSE
#> [111,] FALSE FALSE FALSE
#> [112,] FALSE FALSE FALSE
#> [113,] FALSE FALSE FALSE
#> [114,] FALSE FALSE FALSE
#> [115,] FALSE FALSE FALSE
#> [116,] FALSE FALSE FALSE
#> [117,] FALSE FALSE FALSE
#> [118,] FALSE FALSE FALSE
#> [119,] FALSE FALSE FALSE
#> [120,] FALSE FALSE FALSE
#> [121,] FALSE FALSE FALSE
#> [122,] FALSE FALSE FALSE
#> [123,] FALSE FALSE FALSE
#> [124,] FALSE FALSE FALSE
#> [125,] FALSE FALSE FALSE
#> [126,] FALSE FALSE FALSE
#> [127,] FALSE FALSE FALSE
#> [128,] FALSE FALSE FALSE
#> [129,] FALSE FALSE FALSE
#> [130,] FALSE FALSE FALSE
#> [131,] FALSE FALSE FALSE
#> [132,] FALSE FALSE FALSE
#> [133,] FALSE FALSE FALSE
#> [134,] FALSE FALSE FALSE
#> [135,] FALSE FALSE FALSE
#> [136,] FALSE FALSE FALSE
#> [137,] FALSE FALSE FALSE
#> [138,] FALSE FALSE FALSE
#> [139,] FALSE FALSE FALSE
#> [140,] FALSE FALSE FALSE
#> [141,] FALSE FALSE FALSE
#> [142,] FALSE FALSE FALSE
#> [143,] FALSE FALSE FALSE
#> [144,] FALSE FALSE FALSE
#> [145,] FALSE FALSE FALSE
#> [146,] FALSE FALSE FALSE
#> [147,] FALSE FALSE FALSE
#> [148,] FALSE FALSE FALSE
#> [149,] FALSE FALSE FALSE
#> [150,] FALSE FALSE FALSE
#> [151,] FALSE FALSE FALSE
#> [152,] FALSE FALSE FALSE
#> [153,] FALSE FALSE FALSE
#> [154,] FALSE FALSE FALSE
#> [155,] FALSE FALSE FALSE
#> [156,] FALSE FALSE FALSE
#> [157,] FALSE FALSE FALSE
#> [158,] FALSE FALSE FALSE
#> [159,] FALSE FALSE FALSE
#> [160,] FALSE FALSE FALSE
#> [161,] FALSE FALSE FALSE
#> [162,] FALSE FALSE FALSE
#> [163,] FALSE FALSE FALSE
#> [164,] FALSE FALSE FALSE
#> [165,] FALSE FALSE FALSE
#> [166,] FALSE FALSE FALSE
#> [167,] FALSE FALSE FALSE
#> [168,] FALSE FALSE FALSE
#> [169,] FALSE FALSE FALSE
#> [170,] FALSE FALSE FALSE
#> [171,] FALSE FALSE FALSE
#> [172,] FALSE FALSE FALSE
#> [173,] FALSE FALSE FALSE
#> [174,] FALSE FALSE FALSE
#> [175,] FALSE FALSE FALSE
#> [176,] FALSE FALSE FALSE
#> [177,] FALSE FALSE FALSE
#> [178,] FALSE FALSE FALSE
#> [179,] FALSE FALSE FALSE
#> [180,] FALSE FALSE FALSE
#> [181,] FALSE FALSE FALSE
#> [182,] FALSE FALSE FALSE
#> [183,] FALSE FALSE FALSE
#> [184,] FALSE FALSE FALSE
#> [185,] FALSE FALSE FALSE
#> [186,] FALSE FALSE FALSE
#> [187,] FALSE FALSE FALSE
#> [188,] FALSE FALSE FALSE
#> [189,] FALSE FALSE FALSE
#> [190,] FALSE FALSE FALSE
#> [191,] FALSE FALSE FALSE
#> [192,] FALSE FALSE FALSE
#> [193,] FALSE FALSE FALSE
#> [194,] FALSE FALSE FALSE
#> [195,] FALSE FALSE FALSE
#> [196,] FALSE FALSE FALSE
#> [197,] FALSE FALSE FALSE
#> [198,] FALSE FALSE FALSE
#> [199,] FALSE FALSE FALSE
#> [200,] FALSE FALSE FALSE
#> [201,] FALSE FALSE FALSE
#> [202,] FALSE FALSE FALSE
#> [203,] FALSE FALSE FALSE
#> [204,] FALSE FALSE FALSE
#> [205,] FALSE FALSE FALSE
#> [206,] FALSE FALSE FALSE
#> [207,] FALSE FALSE FALSE
#> [208,] FALSE FALSE FALSE
#> [209,] FALSE FALSE FALSE
#> [210,] FALSE FALSE FALSE
#> [211,] FALSE FALSE FALSE
#> [212,] FALSE FALSE FALSE
#> [213,] FALSE FALSE FALSE
#> [214,] FALSE FALSE FALSE
#> [215,] FALSE FALSE FALSE
#> [216,] FALSE FALSE FALSE
#> [217,] FALSE FALSE FALSE
#> [218,] FALSE FALSE FALSE
#> [219,] FALSE FALSE FALSE
#> [220,] FALSE FALSE FALSE
#> [221,] FALSE FALSE FALSE
#> [222,] FALSE FALSE FALSE
#> [223,] FALSE FALSE FALSE
#> [224,] FALSE FALSE FALSE
#> [225,] FALSE FALSE FALSE
#> [226,] FALSE FALSE FALSE
#> [227,] FALSE FALSE FALSE
#> [228,] FALSE FALSE FALSE
#> [229,] FALSE FALSE FALSE
#> [230,] FALSE FALSE FALSE
#> [231,] FALSE FALSE FALSE
#> [232,] FALSE FALSE FALSE
#> [233,] FALSE FALSE FALSE
#> [234,] FALSE FALSE FALSE
#> [235,] FALSE FALSE FALSE
#> [236,] FALSE FALSE FALSE
#> [237,] FALSE FALSE FALSE
#> [238,] FALSE FALSE FALSE
#> [239,] FALSE FALSE FALSE
#> [240,] FALSE FALSE FALSE
#> [241,] FALSE FALSE FALSE
#> [242,] FALSE FALSE FALSE
#> [243,] FALSE FALSE FALSE
#> [244,] FALSE FALSE FALSE
#> [245,] FALSE FALSE FALSE
#> [246,] FALSE FALSE FALSE
#> [247,] FALSE FALSE FALSE
#> [248,] FALSE FALSE FALSE
#> [249,] FALSE FALSE FALSE
#> [250,] FALSE FALSE FALSE
#> [251,] FALSE FALSE FALSE
#> [252,] FALSE FALSE FALSE
#> [253,] FALSE FALSE FALSE
#> [254,] FALSE FALSE FALSE
#> [255,] FALSE FALSE FALSE
#> [256,] FALSE FALSE FALSE
#> [257,] FALSE FALSE FALSE
#> [258,] FALSE FALSE FALSE
#> [259,] FALSE FALSE FALSE
#> [260,] FALSE FALSE FALSE
#> [261,] FALSE FALSE FALSE
#> [262,] FALSE FALSE FALSE
#> [263,] FALSE FALSE FALSE
#> [264,] FALSE FALSE FALSE
#> [265,] FALSE FALSE FALSE
#> [266,] FALSE FALSE FALSE
#> [267,] FALSE FALSE FALSE
#> [268,] FALSE FALSE FALSE
#> [269,] FALSE FALSE FALSE
#> [270,] FALSE FALSE FALSE
#> [271,] FALSE FALSE FALSE
#> [272,] FALSE FALSE FALSE
#> [273,] FALSE FALSE FALSE
#> [274,] FALSE FALSE FALSE
#> [275,] FALSE FALSE FALSE
#> [276,] FALSE FALSE FALSE
#> [277,] FALSE FALSE FALSE
#> [278,] FALSE FALSE FALSE
#> [279,] FALSE FALSE FALSE
#> [280,] FALSE FALSE FALSE
#> [281,] FALSE FALSE FALSE
#> [282,] FALSE FALSE FALSE
#> [283,] FALSE FALSE FALSE
#> [284,] FALSE FALSE FALSE
#> [285,] FALSE FALSE FALSE
#> [286,] FALSE FALSE FALSE
#> [287,] FALSE FALSE FALSE
#> [288,] FALSE FALSE FALSE
#> [289,] FALSE FALSE FALSE
#> [290,] FALSE FALSE FALSE
#> [291,] FALSE FALSE FALSE
#> [292,] FALSE FALSE FALSE
#> [293,] FALSE FALSE FALSE
#> [294,] FALSE FALSE FALSE
#> [295,] FALSE FALSE FALSE
#> [296,] FALSE FALSE FALSE
#> [297,] FALSE FALSE FALSE
#> [298,] FALSE FALSE FALSE
#> [299,] FALSE FALSE FALSE
#> [300,] FALSE FALSE FALSE
#> [301,] FALSE FALSE FALSE
#> [302,] FALSE FALSE FALSE
#> [303,] FALSE FALSE FALSE
#> [304,] FALSE FALSE FALSE
#> [305,] FALSE FALSE FALSE
#> [306,] FALSE FALSE FALSE
#> [307,] FALSE FALSE FALSE
#> [308,] FALSE FALSE FALSE
#> [309,] FALSE FALSE FALSE
#> [310,] FALSE FALSE FALSE
#> [311,] FALSE FALSE FALSE
#> [312,] FALSE FALSE FALSE
#> [313,] FALSE FALSE FALSE
#> [314,] FALSE FALSE FALSE
#> [315,] FALSE FALSE FALSE
#> [316,] FALSE FALSE FALSE
#> [317,] FALSE FALSE FALSE
#> [318,] FALSE FALSE FALSE
#> [319,] FALSE FALSE FALSE
#> [320,] FALSE FALSE FALSE
#> [321,] FALSE FALSE FALSE
#> [322,] FALSE FALSE FALSE
#> [323,] FALSE FALSE FALSE
#> [324,] FALSE FALSE FALSE
#> [325,] FALSE FALSE FALSE
#> [326,] FALSE FALSE FALSE
#> [327,] FALSE FALSE FALSE
#> [328,] FALSE FALSE FALSE
#> [329,] FALSE FALSE FALSE
#> [330,] FALSE FALSE FALSE
#> [331,] FALSE FALSE FALSE
#> [332,] FALSE FALSE FALSE
#> [333,] FALSE FALSE FALSE
#> [334,] FALSE FALSE FALSE
#> [335,] FALSE FALSE FALSE
#> [336,] FALSE FALSE FALSE
#> [337,] FALSE FALSE FALSE
#> [338,] FALSE FALSE FALSE
#> [339,] FALSE FALSE FALSE
#> [340,] FALSE FALSE FALSE
#> [341,] FALSE FALSE FALSE
#> [342,] FALSE FALSE FALSE
#> [343,] FALSE FALSE FALSE
#> [344,] FALSE FALSE FALSE
#> [345,] FALSE FALSE FALSE
#> [346,] FALSE FALSE FALSE
#> [347,] FALSE FALSE FALSE
#> [348,] FALSE FALSE FALSE
#> [349,] FALSE FALSE FALSE
#> [350,] FALSE FALSE FALSE
#> [351,] FALSE FALSE FALSE
#> [352,] FALSE FALSE FALSE
#> [353,] FALSE FALSE FALSE
#> [354,] FALSE FALSE FALSE
#> [355,] FALSE FALSE FALSE
#> [356,] FALSE FALSE FALSE
#> [357,] FALSE FALSE FALSE
#> [358,] FALSE FALSE FALSE
#> [359,] FALSE FALSE FALSE
#> [360,] FALSE FALSE FALSE
#> [361,] FALSE FALSE FALSE
#> [362,] FALSE FALSE FALSE
#> [363,] FALSE FALSE FALSE
#> [364,] FALSE FALSE FALSE
#> [365,] FALSE FALSE FALSE
#> [366,] FALSE FALSE FALSE
#> [367,] FALSE FALSE FALSE
#> [368,] FALSE FALSE FALSE
#> [369,] FALSE FALSE FALSE
#> [370,] FALSE FALSE FALSE
#> [371,] FALSE FALSE FALSE
#> [372,] FALSE FALSE FALSE
#> [373,] FALSE FALSE FALSE
#> [374,] FALSE FALSE FALSE
#> [375,] FALSE FALSE FALSE
#> [376,] FALSE FALSE FALSE
#> [377,] FALSE FALSE FALSE
#> [378,] FALSE FALSE FALSE
#> [379,] FALSE FALSE FALSE
#> [380,] FALSE FALSE FALSE
#> [381,] FALSE FALSE FALSE
#> [382,] FALSE FALSE FALSE
#> [383,] FALSE FALSE FALSE
#> [384,] FALSE FALSE FALSE
#> [385,] FALSE FALSE FALSE
#> [386,] FALSE FALSE FALSE
#> [387,] FALSE FALSE FALSE
#> [388,] FALSE FALSE FALSE
#> [389,] FALSE FALSE FALSE
#> [390,] FALSE FALSE FALSE
#> [391,] FALSE FALSE FALSE
#> [392,] FALSE FALSE FALSE
#> [393,] FALSE FALSE FALSE
#> [394,] FALSE FALSE FALSE
#> [395,] FALSE FALSE FALSE
#> [396,] FALSE FALSE FALSE
#> [397,] FALSE FALSE FALSE
#> [398,] FALSE FALSE FALSE
#> [399,] FALSE FALSE FALSE
#> [400,] FALSE FALSE FALSE
#> [401,] FALSE FALSE FALSE
#> [402,] FALSE FALSE FALSE
#> [403,] FALSE FALSE FALSE
#> [404,] FALSE FALSE FALSE
#> [405,] FALSE FALSE FALSE
#> [406,] FALSE FALSE FALSE
#> [407,] FALSE FALSE FALSE
#> [408,] FALSE FALSE FALSE
#> [409,] FALSE FALSE FALSE
#> [410,] FALSE FALSE FALSE
#> [411,] FALSE FALSE FALSE
#> [412,] FALSE FALSE FALSE
#> [413,] FALSE FALSE FALSE
#> [414,] FALSE FALSE FALSE
#> [415,] FALSE FALSE FALSE
#> [416,] FALSE FALSE FALSE
#> [417,] FALSE FALSE FALSE
#> [418,] FALSE FALSE FALSE
#> [419,] FALSE FALSE FALSE
#> [420,] FALSE FALSE FALSE
#> [421,] FALSE FALSE FALSE
#> [422,] FALSE FALSE FALSE
#> [423,] FALSE FALSE FALSE
#> [424,] FALSE FALSE FALSE
#> [425,] FALSE FALSE FALSE
#> [426,] FALSE FALSE FALSE
#> [427,] FALSE FALSE FALSE
#> [428,] FALSE FALSE FALSE
#> [429,] FALSE FALSE FALSE
#> [430,] FALSE FALSE FALSE
#> [431,] FALSE FALSE FALSE
#> [432,] FALSE FALSE FALSE
#> [433,] FALSE FALSE FALSE
#> [434,] FALSE FALSE FALSE
#> [435,] FALSE FALSE FALSE
#> [436,] FALSE FALSE FALSE
#> [437,] FALSE FALSE FALSE
#> [438,] FALSE FALSE FALSE
#> [439,] FALSE FALSE FALSE
#> [440,] FALSE FALSE FALSE
#> [441,] FALSE FALSE FALSE
#> [442,] FALSE FALSE FALSE
#> [443,] FALSE FALSE FALSE
#> [444,] FALSE FALSE FALSE
#> [445,] FALSE FALSE FALSE
#> [446,] FALSE FALSE FALSE
#> [447,] FALSE FALSE FALSE
#> [448,] FALSE FALSE FALSE
#> [449,] FALSE FALSE FALSE
#> [450,] FALSE FALSE FALSE
#> [451,] FALSE FALSE FALSE
#> [452,] FALSE FALSE FALSE
#> [453,] FALSE FALSE FALSE
#> [454,] FALSE FALSE FALSE
#> [455,] FALSE FALSE FALSE
#> [456,] FALSE FALSE FALSE
#> [457,] FALSE FALSE FALSE
#> [458,] FALSE FALSE FALSE
#> [459,] FALSE FALSE FALSE
#> [460,] FALSE FALSE FALSE
#> [461,] FALSE FALSE FALSE
#> [462,] FALSE FALSE FALSE
#> [463,] FALSE FALSE FALSE
#> [464,] FALSE FALSE FALSE
#> [465,] FALSE FALSE FALSE
#> [466,] FALSE FALSE FALSE
#> [467,] FALSE FALSE FALSE
#> [468,] FALSE FALSE FALSE
#> [469,] FALSE FALSE FALSE
#> [470,] FALSE FALSE FALSE
#> [471,] FALSE FALSE FALSE
#> [472,] FALSE FALSE FALSE
#> [473,] FALSE FALSE FALSE
#> [474,] FALSE FALSE FALSE
#> [475,] FALSE FALSE FALSE
#> [476,] FALSE FALSE FALSE
#> [477,] FALSE FALSE FALSE
#> [478,] FALSE FALSE FALSE
#> [479,] FALSE FALSE FALSE
#> [480,] FALSE FALSE FALSE
#> [481,] FALSE FALSE FALSE
#> [482,] FALSE FALSE FALSE
#> [483,] FALSE FALSE FALSE
#> [484,] FALSE FALSE FALSE
#> [485,] FALSE FALSE FALSE
#> [486,] FALSE FALSE FALSE
#> [487,] FALSE FALSE FALSE
#> [488,] FALSE FALSE FALSE
#> [489,] FALSE FALSE FALSE
#> [490,] FALSE FALSE FALSE
#> [491,] FALSE FALSE FALSE
#> [492,] FALSE FALSE FALSE
#> [493,] FALSE FALSE FALSE
#> [494,] FALSE FALSE FALSE
#> [495,] FALSE FALSE FALSE
#> [496,] FALSE FALSE FALSE
#> [497,] FALSE FALSE FALSE
#> [498,] FALSE FALSE FALSE
#> [499,] FALSE FALSE FALSE
#> [500,] FALSE FALSE FALSE