В R скользящее стандартное отклонение, которое может пропускать значения NA?
Мне интересно, есть ли какие-нибудь быстрые функции R, которые могут вычислять скользящее стандартное отклонение для вектора, пропуская при этом любые значения NA в середине указанного вектора, так что вектор все еще совпадает с исходными данными?
Посылка TTR
имеет runSD
но он возвращает ошибку, если в середине вектора есть NA.
Посылка fTrading
имеет rollVar
у которого есть na.rm=TRUE
, Взятие квадратного корня из скользящей дисперсии дает стандартное отклонение. Тем не менее, он фактически удаляет значения NA, что означает, что стандартное отклонение скользящего больше не совпадает с исходными данными.
Или есть способ временно удалить значения NA, а затем вставить их обратно после завершения расчета?
Обновить
2 ответа
Это то, что вы ищите?
library(zoo)
set.seed(1)
x <- sample(c(1:3, NA), replace = TRUE, size = 10)
r <- rollapply(data = x, width = 3, FUN = sd, fill = NA)
r
Код ниже, кажется, работает хорошо.
Рассчитать результат, используя na.omit(X)
, затем вставьте значения NA обратно, используя функцию ниже. Код ниже использует квадратный корень, однако вы можете использовать любую функцию, включая runSD
,
# Inserts NA back into result, based on a "template" (a vector with existing NA values)
ReNA <- function(NAtemplate,result)
{
NAtemplate[!is.na(NAtemplate)]<-result;NAtemplate
}
X=c(4,9,NA,16,NA)
X
[1] 4 9 NA 16 NA
result <- sqrt(na.omit(X))
X=ReNA(X,result)
X
[1] 2 3 NA 4 NA
# These values are the square root of the previous, with NA values inserted back in.