代码之家  ›  专栏  ›  技术社区  ›  Chris Farmer Marcelo Cantos

如何在r中平滑数组?

  •  1
  • Chris Farmer Marcelo Cantos  · 技术社区  · 15 年前

    我在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)
    

    当我运行此命令时,会得到以下错误:

    平滑.spline(a)中的错误:至少需要四个唯一的“x”值

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

    2 回复  |  直到 9 年前
        1
  •  8
  •   Alex Brown    15 年前

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

    apply(myarray,1,smooth.spline)
    

    apply(myarray,2,smooth.spline)
    

    我不熟悉二维平滑,但对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)
    

    制作了一个漂亮的情节。

        2
  •  7
  •   Dirk is no longer here    15 年前

    平滑的 是一个大主题,许多函数在r本身中可用,并通过其他包从诸如 CRAN . 畅销书' 现代应用统计学 '由Venables和Ripley在第8.1节中列出了其中一些: (我想——我的第四版已经开始工作了)和图8.1:

    • 多项式回归: lm(y ~ poly(x))
    • 自然样条线: lm(y ~ ns(x))
    • 平滑样条曲线: smooth.splines(x, y)
    • Lowess: lowess(x, y) (以及更新/首选的方法)
    • 克里斯蒂: ksmooth(x, y)
    • SuSMUU: spusmu(x, y)

    如果安装 MASS 与书配套的包,可以通过文件运行 scripts/ch08.R 尝试一下自己。