我在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新手,所以请随时纠正我在这里滥用条款的行为!
答案 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(x, y)
(以及更新/首选方法ksmooth(x, y)
spusmu(x, y)
如果您安装随本书附带的MASS软件包,则可以通过文件scripts/ch08.R
运行此程序并亲自体验。
答案 2 :(得分:0)
检查fields
程序包(https://github.com/NCAR/fields),尤其是非常有用的小插图:https://github.com/NCAR/fields/blob/master/fieldsVignette.pdf