x1 = runif(100)*10 x2 = runif(100)*20 x3 = runif(100)*30 y = x1^3 - 10*x1^2 + 5*x1 - .1*x2^3 + 2*x2^2 + 4*x2 + 12 + 7 * x3 + 14*rnorm(100) plot(x1,y) c1 = ksmooth(x1,y, bandwidth = bw.nrd(x1),x.points=x1) lines(c1) fit1 = rep(0,100) fit1[order(x1)] = c1$y y1 = y - fit1 ## these are the residuals from this first fit ## note that x1 is not ordered, so if you do lines(x1,y1), it won't look good ## because lines joins the first point to the second point to the third, etc. ## but you can do points(x1,fit1,pch=2) to check that things are going ok. plot(x2,y1,ylab="residuals after first kernel smoothing") c2 = ksmooth(x2,y1, bandwidth = bw.nrd(x2),x.points=x2) lines(c2) fit2 = fit1 fit2[order(x2)] = c2$y ## to check, try points(x2,fit2,pch=2) y2 = y1 - fit2 ## residuals after 2nd fit plot(x3, y2,xlab="x3",ylab="residuals after 2 kernel smoothings") c3 = lsfit(x3, y2) abline(c3) c3$coef ## compare with 7 plot(x3,c3$resid,ylab="residuals after 2 kernels and a line") par(mfrow=c(1,2)) hist(y2,nclass=20,xlab="residuals after 2 kernels",main="", xlim=range(c(y2,c3$resid))) hist(c3$resid, nclass=20, xlab="residuals after 2 kernels and a line",main="", xlim=range(c(y2,c3$resid))) par(mfrow=c(1,1)) plot(x3, y2,xlab="x3",ylab="residuals after 2 kernel smoothings") c4 = ksmooth(x3, y2, bandwidth = bw.nrd(x3),x.points=x3) lines(c4) fit3 = fit1 fit3[order(x3)] = c4$y y3 = y2 - fit3 plot(x3, y3,ylab="residuals after 3 kernel smoothings") par(mfrow=c(1,2)) x5 = hist(c3$resid, nclass=20, xlab="residuals after 2 kernels and a line",main="", xlim=range(c(y3,c3$resid))) hist(y3, breaks=20, xlab="residuals after 3 kernels",main="", xlim=range(c(y3,c3$resid)))