我在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新手,所以请随时纠正我在这里滥用的条款!
要在垂直轴或水平轴上进行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)
制作了一个漂亮的情节.
平滑是一个很大的主题,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并自己试验.
| 归档时间: |
|
| 查看次数: |
4762 次 |
| 最近记录: |