从矩阵平滑曲面图

use*_*121 3 r smooth matrix 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)
Run Code Online (Sandbox Code Playgroud)

表面图不平滑

有任何想法吗?

Rei*_*son 8

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

冷杉,一些模拟数据

set.seed(1)
m <- matrix(runif(11*8), ncol = 8)
Run Code Online (Sandbox Code Playgroud)

要对这些进行建模,您需要在表单中使用它们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
Run Code Online (Sandbox Code Playgroud)

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

require("mgcv")
mod <- gam(z ~ te(x, y), data = df)
Run Code Online (Sandbox Code Playgroud)

该模型是xy"位置" 的二维张量积样条.

要复制您的绘图,但要更平滑,请采用模型的拟合值并再次排列为矩阵

m2 <- matrix(fitted(mod), ncol = 8)
Run Code Online (Sandbox Code Playgroud)

然后情节

require("lattice")
wireframe(m2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

根据您的操作,您可以通过以下两个选项控制平滑度te():

  1. k设定光滑度的自由度或复杂度.这里确实设置了基函数的初始尺寸,然后通过惩罚回归将其缩小到一些"最佳维度.对于通过拟合的张量积样条te(),您可以指定k样条的两个维度.要k = 5在两个方向上设置使用te(x, y, k = 5)具有不同的基础尺寸te(x, y, k = c(10,5))用于例如具有尺寸10基础函数x和尺寸5 y.

  2. 修正自由度,即不做我上面提到的任何惩罚.您可以通过添加fx = TRUEte()呼叫来完成此操作.继续最后一个例子,te(x, y, k = c(10,5), fx = TRUE)将使用上面的基函数,但不会从这减少到一些较小的自由度.