2010-01-23 63 views
1

我在R中有一個二維數組,它表示一個行和列的網格的值數據。它看起來像這樣:如何平滑R中的數組?

 [,1] [,2] [,3] [,4] 
[1,] 1 1 2 1 
[2,] 1 5 6 3 
[3,] 2 3 2 1 
[4,] 1 1 1 1 

我想「平滑」這些值。在這個概念驗證點上,我很好地使用任何流行的平滑功能。我目前正在嘗試使用smooth.spline功能:可通過(天真)調用

smoothed <- smooth.spline(myarray) 

當我運行這個

smooth.spline(x, y = NULL, w = NULL, df, spar = NULL, 
       cv = FALSE, all.knots = FALSE, nknots = NULL, 
       keep.data = TRUE, df.offset = 0, penalty = 1, 
       control.spar = list()) 

,我得到這個錯誤:

Error in smooth.spline(a) : need at least four unique 'x' values

我的陣列有四個或更多獨特的價值觀,所以我想我不知道如何正確格式化輸入數據。有人能給我一些指向這種事情的指針嗎?類似smooth函數的例子似乎適用於單維向量,而我似乎無法外推到二維世界。我是R新手,所以請隨時糾正我在這裏濫用條款!

回答

8

待辦事項1-d平滑在任一垂直或水平軸,使用適用:

apply(myarray,1,smooth.spline) 

apply(myarray,2,smooth.spline) 

我不熟悉與2- d平滑,但快速試驗田間包似乎工作。您將需要安裝包fields及其依賴關係。其中myMatrix是你在上面有矩陣...(我重新創建):

# transform data into x,y and z 
m = c(1,1,2,1,1,5,6,3,2,3,2,1,1,1,1,1) 
myMatrix = matrix(m,4,4,T) 
myMatrix 
    [,1] [,2] [,3] [,4] 
[1,] 1 1 2 1 
[2,] 1 5 6 3 
[3,] 2 3 2 1 
[4,] 1 1 1 1 
Z = as.vector(myMatrix) 
XY=data.frame(x=as.numeric(gl(4,1,16),Y=as.numeric(gl(4,4,16)) 
t=Tps(XY,Z) 
surface(t) 

製作一個漂亮的曲線。

+0

謝謝...這工作很好! – 2010-01-23 21:54:48

7

平滑是一個很大的話題,許多功能都可以在R本身和通過額外的軟件包從像CRAN這樣的地方。暢銷書「現代應用統計帶有S」由維納布爾斯和裏普利列出了一些他們的第8.1節: (我想 - 我的第4版是在工作中)和圖8.1:

  • 多項式迴歸:lm(y ~ poly(x))
  • 自然樣條:lm(y ~ ns(x))
  • 平滑樣條:smooth.splines(x, y)
  • LOWESS:lowess(x, y)(和一個較新的/優選的方法
  • ksmooth:ksmooth(x, y)
  • supsmu:spusmu(x, y)

如果安裝MASS包的書的話,你可以通過文件scripts/ch08.R運行這個和實驗自己。