В R скользящее стандартное отклонение, которое может пропускать значения NA?

Мне интересно, есть ли какие-нибудь быстрые функции R, которые могут вычислять скользящее стандартное отклонение для вектора, пропуская при этом любые значения NA в середине указанного вектора, так что вектор все еще совпадает с исходными данными?

Посылка TTR имеет runSD но он возвращает ошибку, если в середине вектора есть NA.

Посылка fTrading имеет rollVar у которого есть na.rm=TRUE, Взятие квадратного корня из скользящей дисперсии дает стандартное отклонение. Тем не менее, он фактически удаляет значения NA, что означает, что стандартное отклонение скользящего больше не совпадает с исходными данными.

Или есть способ временно удалить значения 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.
Другие вопросы по тегам