Advertisement
tonytonov

On-the-fly variance correction

Aug 1st, 2014
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 2.35 KB | None | 0 0
  1. stat <- function(v)
  2. {
  3.   list(mean = mean(v), sqsum = sum(v^2), var = var(v), sd = sd(v))
  4. }
  5.  
  6. add <- function(l, n, x)
  7. {
  8.   l$mean <- (n * l$mean + x) / (n + 1)
  9.   l$sqsum <- l$sqsum + x^2
  10.   l$var <- (l$sqsum - (n + 1) * l$mean^2) / n
  11.   l$sd <- sqrt(l$var)
  12.   l
  13. }
  14.  
  15. add_many <- function(l, n, x)
  16. {
  17.   k <- length(x)
  18.   l$mean <- (n * l$mean + sum(x)) / (n + k)
  19.   l$sqsum <- l$sqsum + sum(x^2)
  20.   l$var <- (l$sqsum - (n + k) * l$mean^2) / (n + k - 1)
  21.   l$sd <- sqrt(l$var)
  22.   l
  23. }
  24.  
  25. delete <- function(l, n, x)
  26. {
  27.   l$mean <- (n * l$mean - x) / (n - 1)
  28.   l$sqsum <- l$sqsum - x^2
  29.   l$var <- (l$sqsum - (n - 1) * l$mean^2) / (n - 2)
  30.   l$sd <- sqrt(l$var)
  31.   l
  32. }
  33.  
  34. delete_many <- function(l, n, x)
  35. {
  36.   k <- length(x)
  37.   if (k > n) stop()
  38.   l$mean <- (n * l$mean - sum(x)) / (n - k)
  39.   l$sqsum <- l$sqsum - sum(x^2)
  40.   l$var <- (l$sqsum - (n - k) * l$mean^2) / (n - k - 1)
  41.   l$sd <- sqrt(l$var)
  42.   l
  43. }
  44.  
  45. change <- function(l, n, x_out, x_in)
  46. {
  47.   l$mean <- l$mean + (x_in - x_out) / n
  48.   l$sqsum <- l$sqsum + x_in^2 - x_out^2
  49.   l$var <- (l$sqsum - n * l$mean^2) / (n - 1)
  50.   l$sd <- sqrt(l$var)
  51.   l
  52. }
  53.  
  54. change_many <- function(l, n, x_out, x_in)
  55. {
  56.   if (length(x_in) != length(x_out)) stop()
  57.   l$mean <- l$mean + (sum(x_in) - sum(x_out)) / n
  58.   l$sqsum <- l$sqsum + sum(x_in^2) - sum(x_out^2)
  59.   l$var <- (l$sqsum - n * l$mean^2) / (n - 1)
  60.   l$sd <- sqrt(l$var)
  61.   l
  62. }
  63.  
  64. change_universal <- function(l, n, x_out, x_in)
  65. {
  66.   k_out <- length(x_out)
  67.   k_in <- length(x_in)
  68.   n_total <- (n + k_in - k_out)
  69.   if (k_out > k_in + n) stop()
  70.   l$mean <- (n * l$mean + sum(x_in) - sum(x_out)) / n_total
  71.   l$sqsum <- l$sqsum + sum(x_in^2) - sum(x_out^2)
  72.   l$var <- (l$sqsum - n_total * l$mean^2) / (n_total - 1)
  73.   l$sd <- sqrt(l$var)
  74.   l
  75. }
  76.  
  77. v <- 1:100
  78. l <- stat(v)
  79. n <- length(v)
  80. x <- 1:5 / 10
  81.  
  82. all.equal(stat(c(v, 0)), add(l, n, 0))
  83. all.equal(stat(v[-1]), delete(l, n, 1))
  84. all.equal(stat(replace(v, 1, 5)), change(l, n, 1, 5))
  85. all.equal(stat(c(v, x)), add_many(l, n, x))
  86. all.equal(stat(v[-(1:10)]), delete_many(l, n, 1:10))
  87. all.equal(stat(replace(v, 1:10, 1:10/10)), change_many(l, n, 1:10, 1:10/10))
  88.  
  89. w <- v
  90. w <- replace(w, 40:50, 300:310)
  91. w[101:110] <- 201:210
  92. w <- w[-(1:5)]
  93. x_out <- c(40:50, 1:5)
  94. x_in <- c(300:310, 201:210)
  95.  
  96. all.equal(stat(w), change_universal(l, n, x_out, x_in))
  97. all.equal(stat(w), change_universal(l, n, rev(x_out), rev(x_in)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement