1

我在 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”值

我的数组在每个维度中有四个或更多唯一值,所以我认为我不知道如何正确格式化输入数据。有人可以给我一些关于这种事情的指示吗?-like 函数的示例smooth似乎适用于一维向量,我似乎无法外推到二维世界。我是 R 新手,所以请随时在此处纠正我对术语的误用!

4

3 回答 3

8

要在垂直轴或水平轴上进行一维平滑,请使用 apply:

apply(myarray,1,smooth.spline)

或者

apply(myarray,2,smooth.spline)

我不熟悉 2-D 平滑,但对 fields 包的快速实验似乎有效。您将需要安装该软件包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)

制作了一个漂亮的情节。

于 2010-01-23T00:32:46.290 回答
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(x, y)
  • supsmu:spusmu(x, y)

如果你安装了本书附带的MASS包,你可以通过该文件运行它 scripts/ch08.R并自己进行实验。

于 2010-01-23T01:02:41.147 回答
0

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

于 2020-01-14T15:34:16.393 回答