y")

# Wireframe loess surface fit.  See Figure 4.61 from Cleveland.
require(stats)
with(ethanol, {
  eth.lo &lt;- loess(NOx ~ C * E, span = 1/3, parametric = "C", 
                  drop.square = "C", family="symmetric")
  eth.marginal &lt;- list(C = seq(min(C), max(C), length.out = 25), 
                       E = seq(min(E), max(E), length.out = 25))
  eth.grid &lt;- expand.grid(eth.marginal)
  eth.fit &lt;- predict(eth.lo, eth.grid)
  wireframe(eth.fit ~ eth.grid$C * eth.grid$E,
            shade=TRUE,
