Search code examples
r3dsmoothingloess

Creating a Smooth Line in 3D R


I have a set of 3-dimensional points, like the sample data below. I would like to create a smooth line from it. There's information out there about to smooth a 2D surface in 3D space but how would I smooth a 1D line in 3D space?

Z = seq(0, 1, 0.01)
X = rnorm(length(Z), mean = 0, sd = 0.1)
Y = 2 * Z ^ 2 + rnorm(length(Z), mean = 0, sd = 0.1)

data = data.frame(X = X, Y = Y, Z= Z)

Solution

  • This is an example of multivariate regression. If you happen to know that the relationship with Z should be quadratic, you can do

    fit <- lm(cbind(X, Y) ~ poly(Z, 2))
    

    But I'm assuming you don't know that, and want some kind of general smoother. I don't think loess, lowess, or gam handle multivariate regression, but you can use natural splines in lm:

    library(splines)
    fit <- lm(cbind(X, Y) ~ ns(Z, df = 4))
    

    The fitted values will be returned in a two-column matrix by predict(fit). To plot the result, you can use rgl:

    library(rgl)
    plot3d(X, Y, Z, col = "red")
    lines3d(cbind(predict(fit), Z))
    

    screenshot