代码之家  ›  专栏  ›  技术社区  ›  Jérôme Verstrynge

如何在R中保存和加载样条插值函数?

  •  1
  • Jérôme Verstrynge  · 技术社区  · 6 年前

    我需要创建成千上万的插值样条,每个样条基于5对 (x, y) 价值观。我想将它们保存在数据库(或csv文件)中。

    如何导出/导入它们,例如以文本格式或作为实参数组导出/导入它们,以便在需要时重建每个函数?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Zheyuan Li    6 年前

    如果您使用的是R Base Package中的 splinefun function stats ,则很容易导出其构造信息。

    set.seed(0)
    XK<-C(0、1、2)
    YK<-圆形(RUNIF(3),2)
    F<-SplineFun(XK,YK,“自然”)35;自然三次样条曲线
    建筑信息-环境(F)$Z
    str(施工信息)
    #$方法:int 2
    #$N:利息3
    #$x:num[1:3]0 1 2
    #$Y:num[1:3]0.9 0.27 0.37美元
    #$B:num[1:3]-0.812-0.265 0.282美元
    #$C:num[1:3]0 0.547 0美元
    #$D:num[1:3]0.182-0.182 0美元
    < /代码> 
    
    

    下面说明了它们的含义以及我们如何手动重新构造样条曲线。

    有n=3个点,(x[i],y[i]),因此有两个。

    attach(施工信息)
    
    ##用灰色绘制插值样条线
    曲线(f(x,0),从=x[1],到=x[n],Lwd=10,col=8)
    
    ##突出显示结
    点(x,y,pch=19)
    
    ##分段重建
    分段立方和lt;-函数(X,Xi,Yi,Bi,CI,DI){
    Y+Bi*(X-XI)+Ci*(X-XI)^ 2 +DI*(X-XI)^ 3
    }
    
    ##循环通过件
    对于(i i n 1:(n-1))。{
    曲线(件立方(x,x[i],y[i],b[i],c[i],d[i]),从=x[i],到=x[i+1],
    加=真,col=i+1)
    }
    
    分离(构造信息)
    < /代码> 
    
    

    我们看到我们的手册重新构建是正确的。

    导出结构信息允许我们离开R并将其用于其他地方。

    set.seed(0)
    xk <- c(0, 1, 2)
    yk <- round(runif(3), 2)
    f <- splinefun(xk, yk, "natural")  ## natural cubic spline
    construction_info <- environment(f)$z
    str(construction_info)
    # $ method: int 2
    # $ n     : int 3
    # $ x     : num [1:3] 0 1 2
    # $ y     : num [1:3] 0.9 0.27 0.37
    # $ b     : num [1:3] -0.812 -0.265 0.282
    # $ c     : num [1:3] 0 0.547 0
    # $ d     : num [1:3] 0.182 -0.182 0
    

    下面说明了它们的含义以及我们如何手动重新构造样条曲线。

    有n=3分,(x[i], y[i])因此有两件。

    attach(construction_info)
    
    ## plot the interpolation spline in gray
    curve(f(x, 0), from = x[1], to = x[n], lwd = 10, col = 8)
    
    ## highlight knots
    points(x, y, pch = 19)
    
    ## piecewise re-construction 
    piece_cubic <- function (x, xi, yi, bi, ci, di) {
      yi + bi * (x - xi) + ci * (x - xi) ^ 2 + di * (x - xi) ^ 3
      }
    
    ## loop through pieces
    for (i in 1:(n - 1)) {
      curve(piece_cubic(x, x[i], y[i], b[i], c[i], d[i]), from = x[i], to = x[i + 1],
            add = TRUE, col = i + 1)
      }
    
    detach(construction_info)
    

    enter image description here

    我们看到我们的手册是正确的。

    导出建筑信息可以让我们远离R并将其用于其他地方。