7

時系列を平滑化するためにチェビシェフフィルターを実装しようとしていますが、残念ながら、データ系列にはNAがあります。

例えば、

t <- seq(0, 1, len = 100)                     
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)),NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t)))

私はチェビシェフフィルターを使用しています:cf1 = cheby1(5, 3, 1/44, type = "low")

NAを除外する時系列をフィルタリングしようとしていますが、注文/位置を台無しにしないでください。だから、私はすでに試しna.rm=Tましたが、そのような議論はないようです。それで

z <- filter(cf1, x)   # apply filter

君たちありがとう。

4

4 に答える 4

2

x <- x[!is.na(x)]を使用して NA を削除してから、フィルターを実行してみてください。

于 2012-07-18T12:45:08.313 に答える
1

この機能を使用して、事前にNAを削除することができcompelete.casesます。また、不足しているデータを代入することを検討することもできます。mtsdiまたはAmeliaIIパッケージを確認してください。

編集:

これがRcppの解決策です。これは、速度が重要である場合に役立つ可能性があります。

require(inline)
require(Rcpp)
t <- seq(0, 1, len = 100)
set.seed(7337)
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)),NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t)))
NAs <- x
x2 <- x[!is.na(x)]
#do something to x2
src <- '
Rcpp::NumericVector vecX(vx);
Rcpp::NumericVector vecNA(vNA);
int j = 0;   //counter for vx
for (int i=0;i<vecNA.size();i++) {
  if (!(R_IsNA(vecNA[i]))) {
    //replace and update j
    vecNA[i] = vecX[j];
    j++;
  }
 }
return Rcpp::wrap(vecNA);
'
fun <- cxxfunction(signature(vx="numeric",
                             vNA="numeric"),
                   src,plugin="Rcpp")
if (identical(x,fun(x2,NAs)))
    print("worked")
# [1] "worked"
于 2012-07-18T12:46:52.163 に答える
1

オブジェクトに欠損値があるかどうかはわかりませんがts、値を再挿入したいだけならfromNAを使用できます。これを行うためのより良い方法があるかもしれません。?insertR.utils

install.packages(c('R.utils', 'signal'))
require(R.utils)
require(signal)
t <- seq(0, 1, len = 100)                     
set.seed(7337)
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)), NA, NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t)), NA)
cf1 = cheby1(5, 3, 1/44, type = "low")
xex <- na.omit(x)
z <- filter(cf1, xex)   # apply
z <- as.numeric(z)
for (m in attributes(xex)$na.action) {
  z <- insert(z, ats = m, values = NA)
}
all.equal(is.na(z), is.na(x))
?insert
于 2012-07-18T16:00:28.757 に答える
0

NAを含む信号をフィルタリングするために使用できる関数を次に示します。NA はゼロに置き換えられるのではなく、無視されます。

次に、フィルタリングされた信号の任意のポイントで NA が使用できる重みの最大パーセンテージを指定できます。特定のポイントで NA が多すぎる (および実際のデータが少なすぎる) 場合、フィルター処理された信号自体が NA に設定されます。

# This function applies a filter to a time series with potentially missing data 

filter_with_NA <- function(x,
                           window_length=12,                            # will be applied centrally
                           myfilter=rep(1/window_length,window_length), # a boxcar filter by default
                           max_percentage_NA=25)                        # which percentage of weight created by NA should not be exceeded
{
  # make the signal longer at both sides
  signal <- c(rep(NA,window_length),x,rep(NA,window_length))
  # see where data are present and not NA
  present <- is.finite(signal)

  # replace the NA values by zero
  signal[!is.finite(signal)] <- 0
  # apply the filter
  filtered_signal <- as.numeric(filter(signal,myfilter, sides=2))

  # find out which percentage of the filtered signal was created by non-NA values
  # this is easy because the filter is linear
  original_weight <- as.numeric(filter(present,myfilter, sides=2))
  # where this is lower than one, the signal is now artificially smaller 
  # because we added zeros - compensate that
  filtered_signal <- filtered_signal / original_weight
  # but where there are too few values present, discard the signal
  filtered_signal[100*(1-original_weight) > max_percentage_NA] <- NA

  # cut away the padding to left and right which we previously inserted
  filtered_signal <- filtered_signal[((window_length+1):(window_length+length(x)))]
  return(filtered_signal)
}
于 2017-06-23T21:31:51.017 に答える