I want to graph response surface through scatterplot3d but the following code through an error.
library(rsm)
swiss2.lm <- lm(Fertility ~ poly(Agriculture, Education, degree = 2), data = swiss)
persp(swiss2.lm, Education ~ Agriculture, zlab = "Fertility")
library(scatterplot3d)
s3d <-
scatterplot3d(
swiss
# , type = "h"
, highlight.3d = TRUE
, angle = 55
, scale.y = 0.7
, pch = 16
)
s3d$plane3d(swiss2.lm, lty.box = "solid")
How can I figure out the issue?
Error in segments(x, z1, x + y.max * yx.f, z2 + yz.f * y.max, lty = ltya, :
cannot mix zero-length and non-zero-length coordinates
I'm using swiss
data from rsm
library.
How attached are you to using scatterplot3d
? If you're willing to do it in rgl
it's pretty easy. Following from your example:
Set up evenly spaced grid and make predictions:
newdat <- expand.grid(Education=seq(0,50,by=5),
Agriculture=seq(0,100,by=10))
newdat$pp <- predict(swiss2.lm,newdata=newdat)
Plot points and add surface:
library(rgl)
with(swiss,plot3d(Agriculture,Education,Fertility))
with(newdat,surface3d(unique(Agriculture),unique(Education),pp,
alpha=0.3,front="line"))
rgl.snapshot("swiss.png")
rgl
has some advantages (hidden line removal, lighting effects, dynamic rotation and zooming) and some disadvantages (doesn't fit well into base-package layouts etc.; harder to manipulate fonts, include plotmath
equations, etc.; harder to adjust label placement and plot style). The scatter3d
function in the car
package has some nice features for adding regression surfaces to an rgl
plot, but as far as I can see it does additive models, but doesn't allow for quadratic polynomial models ...
As far as I can see, in order to do this in the scatterplot3d
framework you would have to construct the points corresponding to the quadrangles in the regression surface and use xyz.convert
and segments
to draw them ...