Fit a B spline to a control path

前端 未结 1 898
迷失自我
迷失自我 2021-01-24 11:50

I realise lots of questions and answers exists on the use of B-splines in R, but I have yet to find an answer to this (seemingly simple) question.

Given a set of points

相关标签:
1条回答
  • 2021-01-24 12:31

    The general idea is to predict x and y independently, assuming they are in fact independend:

    library(splines)
    
    path <- data.frame(
        x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
        y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
    )
    # add the time variable
    path$time  <- seq(nrow(path))
    
    # fit the models
    df  <-  5
    lm_x <- lm(x~bs(time,df),path)
    lm_y <- lm(y~bs(time,df),path)
    
    # predict the positions and plot them
    pred_df  <-  data.frame(x=0,y=0,time=seq(0,nrow(path),length.out=100) )
    plot(predict(lm_x,newdata = pred_df),
         predict(lm_y,newdata = pred_df),
         type='l')
    

    you do need to be careful about defining your time variable, since the path is not independent of choice of times (even when they're sequential) since splines are not invariant on the spacing of points in the predictor space. For example:

    plotpath  <-  function(...){
        # add the time variable with random spacing
        path$time  <- sort(runif(nrow(path)))
    
        # fit the models
        df  <-  5
        lm_x <- lm(x~bs(time,df),path)
        lm_y <- lm(y~bs(time,df),path)
    
        # predict the positions and plot them
        pred_df  <-  data.frame(x=0,y=0,time=seq(min(path$time),max(path$time),length.out=100) )
        plot(predict(lm_x,newdata = pred_df),
             predict(lm_y,newdata = pred_df),
             type='l',...)
    }
    
    par(ask=TRUE); # wait until you click on the figure or hit enter to show the next figure
    for(i in 1:5)
        plotpath(col='red')
    
    0 讨论(0)
提交回复
热议问题