从矩阵平滑曲面图

时间:2013-12-30 22:39:00

标签: r matrix smooth spline

我试图平滑一个11×8矩阵,但我似乎无法找到一种方法来做到这一点。我知道这有几个主题,但没有一个对我的情况有所帮助。我发现的每种方法都需要某种z~x * y方法。在我的情况下,我只有一个矩阵,我想简单地平滑所有单元格条目,以使表面更平滑。

m
       [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]      [,8]
[1,] 29.02530 28.57123 39.02334 38.25483 29.59624 65.01706 41.04771  98.62005
[2,] 24.46539 24.08265 32.89272 32.24494 24.94663 54.80279 34.59906  83.12670
[3,] 28.30679 27.86395 38.05733 37.30784 28.86359 63.40758 40.03159  96.17873
[4,] 24.99883 24.60774 33.60991 32.94800 25.49056 55.99770 35.35345  84.93918
[5,] 24.63308 24.24771 33.11817 32.46595 25.11761 55.17842 34.83621  83.69646
[6,] 29.85776 29.39066 40.14254 39.35199 30.44506 66.88177 42.22497 101.44850
[7,] 18.54275 18.25267 24.92998 24.43901 18.90749 41.53601 26.22324  63.00320
[8,] 24.43846 24.05615 32.85652 32.20945 24.91917 54.74248 34.56098  83.03522
[9,] 27.09827 26.67434 36.43252 35.71503 27.63130 60.70048 38.32249  92.07251
[10,] 37.11375 36.53313 49.89792 48.91525 37.84378 83.13528 52.48642 126.10236
[11,] 26.06763 25.65982 35.04686 34.35666 26.58038 58.39182 36.86495  88.57066

library(lattice)
wireframe(m)

surface plot not smoothed

任何想法?

1 个答案:

答案 0 :(得分:8)

无论你最终做什么,你都需要一些模型来平滑你拥有的数据。您可以使用各种模型进行平滑处理,但我最熟悉的是通过 mgcv 程序包来拟合GAM的惩罚回归样条方法,这也适用于R. / p>

冷杉,一些模拟数据

set.seed(1)
m <- matrix(runif(11*8), ncol = 8)

要对这些进行建模,您需要使用z ~ x + y形式的格式,即长格式,其中每个z(矩阵中的单元格)都有一行。因此,将我们的示例数据排列成长格式

df <- data.frame(x = rep(seq_len(ncol(m)), each = nrow(m)),
                 y = rep(seq_len(nrow(m)), times = ncol(m)),
                 z = c(m))

> head(df)
  x y         z
1 1 1 0.2655087
2 1 2 0.3721239
3 1 3 0.5728534
4 1 4 0.9082078
5 1 5 0.2016819
6 1 6 0.8983897

此处x变化最慢,并且最快引用列y并引用行。接下来加载 mgcv 并适合模型

require("mgcv")
mod <- gam(z ~ te(x, y), data = df)

该模型是xy“位置”的二维张量积样条。

复制你的情节,但更顺畅,取模型的拟合值并再次排列为矩阵

m2 <- matrix(fitted(mod), ncol = 8)

然后绘制

require("lattice")
wireframe(m2)

enter image description here

根据您的工作情况,您可以通过te()的两个选项来控制平滑度:

  1. k设定光滑度的自由度或复杂度。这里确实设置了基函数的初始维数,然后通过惩罚回归将其缩小到某个“最优维度”。对于通过te()拟合的张量积样条,可以为两个维指定k要在两个方向上设置k = 5,请使用te(x, y, k = 5)。要使用不同的基本维度,请使用te(x, y, k = c(10,5))作为x的维度10基础函数和维度5的维度5 y

  2. 修正自由度,即不要做我上面提到的任何惩罚。您可以通过向fx = TRUE电话添加te()来执行此操作。要继续上一个示例,te(x, y, k = c(10,5), fx = TRUE)将使用上述基函数,但不会从此缩小到较小的自由度。