如何在R中平滑数组?

时间:2010-01-23 00:30:06

标签: r spline

我在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函数:

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())
(天真)打电话

smoothed <- smooth.spline(myarray)

当我运行时,我收到此错误:

  

smooth.spline(a)出错:需要至少四个唯一的'x'值

我的数组在每个维度中有四个或更多唯一值,所以我想我不知道如何正确格式化输入数据。有人可以给我一些这方面的指示吗? smooth类函数的示例似乎与单维向量一起使用,我似乎无法推断到二维世界。我是R新手,所以请随时纠正我在这里滥用条款的行为!

3 个答案:

答案 0 :(得分:8)

要在垂直轴或水平轴上进行1-d平滑,请使用apply:

apply(myarray,1,smooth.spline)

apply(myarray,2,smooth.spline)

我不熟悉二维平滑,但是对字段包的快速实验似乎有效。您需要安装包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)

制作了一个漂亮的情节。

答案 1 :(得分:8)

平滑是一个很大的主题,许多功能在R本身和CRAN之类的其他包中可用。 Venables和Ripley的热门书籍“现代应用统计与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运行此程序并亲自体验。

答案 2 :(得分:0)

检查fields程序包(https://github.com/NCAR/fields),尤其是非常有用的小插图:https://github.com/NCAR/fields/blob/master/fieldsVignette.pdf