2010-12-11 16 views
5

İki yüzlü "hareketli ortalama", n sayısını bir vektörün sağından ve solundan ortalamalayan ve ortalama değerden uzaklığına göre ağırlık veren bir işlev nasıl elde edilir?İki taraflı hareketli ortalama?

TTR kullanmayı denedim, ancak hareketli ortalamaları yalnızca soldan sağa doğru çalışıyor ve en soldaki değerleri NA olarak ayarlıyor. Bu yüzden düzgünleştirilmiş vektörü smooth.spline

cevap

8
hayvanat bahçesi paketi rollmean olarak

ve rollapply çeşitli varyasyonları izin bağımsız değişkenler sahiptir.

library(zoo) 
x <- seq(10)^2 

# no NAs at end 
rollmean(x, 3) 

# NAs at ends 
rollmean(x, 3, na.pad = TRUE) 

# weighted mean 
rollapply(zoo(x), 3, function(x) c(1, 2, 1) %*% x/4) 

# at ends take means of less than 3 points - needs devel version 
# partial= is in development and at this point must use na.rm = TRUE to use partial 
source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=802&root=zoo") 
rollapply(zoo(x), 3, mean, partial = TRUE, na.rm = TRUE) 

DÜZENLEME: Bu yazılmıştır beri hayvanat bahçesi gelişme version = partial = TRUE bir kural yazıyor "kısmi" yazılı veya rule = 3 o yerine o kadar değişti ki

Not. Sorun şu ki, geliştirme sürümüne yeni uç kurallar eklendiğinden (şimdi yayınlanmadan önce 3 ve 4'ü eklenecek) her bir kullanıcı arabirimi için ayrı bir argümana sahip olacaktı. Ayrıca rule, R'nin çekirdeğindeki approx ile daha tutarlıdır. Aslında rule=1 ve rule=2, rollapply ve approx (R'nin çekirdeğinden) anlamında daha iyi tutarlılık ve kullanım kolaylığı için aynı anlama sahip olacaktır. Aşağıdaki örnekte bulunan mean numaralı parantezler, 'un henüz uygulamaya konmadığı rollmean numaralı telefonu arayabilmesini engellemek için geliştirme sürümünde gereklidir, ancak bunun yapılması resmi olarak serbest bırakıldığında ortadan kaldırılacaktır.

source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=815&root=zoo") 
rollapply(zoo(x), 3, (mean), rule = "partial") 
+0

Peki neden rollmean çıkışı her zaman bir öğeden daha kısadır? – rsk82

2

için bir giriş olarak kullanamıyorum ile birlikte kernapply'u deneyebilirsiniz (ilk sayfanın sonuna doğru bazı örnekler vardır). filter() fonksiyonuna

5

Bak ve özellikle sides argüman:

filter     package:stats    R Documentation 

Linear Filtering on a Time Series 

Description: 

    Applies linear filtering to a univariate time series or to each 
    series separately of a multivariate time series. 

Usage: 

    filter(x, filter, method = c("convolution", "recursive"), 
      sides = 2, circular = FALSE, init) 

Arguments: 
[...] 
    sides: for convolution filters only. If ‘sides=1’ the filter 
      coefficients are for past values only; if ‘sides=2’ they are 
      centred around lag 0. In this case the length of the filter 
      should be odd, but if it is even, more of the filter is 
      forward in time than backward.