如何在R中平滑数组?

Chr*_*mer 1 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
Run Code Online (Sandbox Code Playgroud)

我想"平滑"这些价值观.在这个概念验证点,我可以使用任何流行的平滑功能.我目前正在尝试使用该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())
Run Code Online (Sandbox Code Playgroud)

(天真)打电话

smoothed <- smooth.spline(myarray)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*own 8

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

apply(myarray,1,smooth.spline)
Run Code Online (Sandbox Code Playgroud)

要么

apply(myarray,2,smooth.spline)
Run Code Online (Sandbox Code Playgroud)

我不熟悉2-D平滑,但是对field包的快速实验似乎有效.您需要安装软件包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)
Run Code Online (Sandbox Code Playgroud)

制作了一个漂亮的情节.


Dir*_*tel 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并自己试验.