2015-08-11 2 views
0

У меня проблема.Замените отсутствующие значения в наборе временных рядов с NA и Zero

Цель: У меня есть ежемесячный набор данных временных рядов, который содержит «нуль», а также «НС». Здесь Зеро ценность, и я хочу, чтобы они были изменены в то время как NA являются недостающими значения, что я ищу вменить с помощью StructTS в R.

Набор данных примера

dataset <- matrix(sample(c(NA, 1:5), 25, replace = TRUE), 5) 
dataset[1,2]<-0 
dataset[4,4] <- 0 

Здесь в наборе данных, я просто хотите заменить NA значением и пусть нуль будет только нулями.

После исследования и читать несколько блогов, я использовал следующие методы:

missvalue <- function(df){ 
    x<-df 
    x <- ts(rev(x),f=12) 

    fit <- ts(rowSums(tsSmooth(StructTS(x))[,-2])) 
    tsp(fit) <- tsp(x) 
    return(list(N=fit)) 
    } 

    Newdata<-lapply(m,missvalue) 

Я также пробовал среднюю технику:

##Missing Value another treatment 

    nzmean <- function(x) { 
    if (all(x==0)) 0 else mean(x[x!=0]) 
    } 
    apply(m,1,nzmean) 

Прикрепленный являются сообщения о котором я говорила:

  1. R Convert NA's only after the first non-zero value
  2. Interpolate missing values in a time series with a seasonal cycle

Любая помощь по этому вопросу будет действительно замечательной.

+0

U может заменить НС на что-то вроде этого 'dataset [is.na (dataset)] <- 250'. просто измените 250 со списком ваших значений, которые нужно заменить. – drmariod

+0

Каков ваш ожидаемый результат 'dataset'? –

+0

Я хочу, чтобы NA заменили либо средние из последних 5 чисел, либо любую другую технику отсутствующего значения. Ноль должен оставаться только на ноль. –

ответ

3

na.approx - полезная функция из пакета «зоопарк». Он будет использовать несколько методов для аппроксимации отсутствующих значений в наборе данных. Поиск ?na.approx для получения дополнительной информации о параметрах и приложениях. Он будет сосредоточен на записи NA и оставит нетронутыми нули. Надеюсь, это поможет.

library(zoo) 
na.approx(dataset) 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1.0 0 4 1 1 
[2,] 5.0 1 3 5 1 
[3,] 3.0 2 4 2 1 
[4,] 3.5 2 2 0 1 
[5,] 4.0 5 2 4 1 

данных

 [,1] [,2] [,3] [,4] [,5] 
[1,] 1 0 4 1 1 
[2,] 5 1 3 5 NA 
[3,] 3 2 4 2 NA 
[4,] NA 2 2 0 1 
[5,] 4 5 2 4 1 
+0

Спасибо Пьер. Это полезно! –

+1

@ReetikaChoudhary Если это сработает, попробуйте принять решение, нажав на галочку рядом с голосованием. – akrun

+0

Добро пожаловать. Рад был помочь. –

1

Я могу рекомендовать пакет imputeTS здесь (я сопровождающий). Делает жизнь очень легкой для этой задачи. (https://cran.r-project.org/web/packages/imputeTS/index.html)

предлагает несколько алгоритмов, как вменение со средним, медиана, линейная интерполяция, сплайн интерполяция, Кальман сглаживанием, ...

Вот один пример:

library(imputeTS) 
dataset[ ,1] <- na.kalman(dataset[ ,1]) 

Еще один:

dataset[ ,1] <- na.interpolation(dataset[ ,1]) 

Другой:

dataset[ ,1] <- na.mean(dataset[ ,1]) 

Еще один:

dataset[ ,1] <- na.locf(dataset[ ,1]) 

Единственным недостатком является то, пакет не позволяет data.frame в качестве входных данных, так что можно было бы перебрать столбцов seperatly. (но с положительной стороны вы также можете использовать разные алгоритмы для разных столбцов)