[R] Query on ksmooth(): Theoretical step function vs. plotted diagonal segments
Rui Barradas
ru|pb@rr@d@@ @end|ng |rom @@po@pt
Thu Mar 19 17:29:35 CET 2026
Às 14:00 de 19/03/2026, 송상은 escreveu:
> Dear R-help members,
>
> Hello,
> I am studying kernel regression and experimenting with the ksmooth()
> function in R.
>
> When using a box kernel, the kernel function is an indicator function
> (weight = 1 inside the bandwidth and 0 outside). Based on this definition,
> I expected the Nadaraya–Watson estimator to produce a step-like function:
> the estimate should remain constant while the set of included points is
> unchanged, and then jump when a point enters or leaves the bandwidth window.
>
> However, when I run the following code using the cars dataset:
>
> par(mfrow=c(1,1))
> with(cars, {
> plot(speed, dist)
> lines(ksmooth(speed, dist, "normal", bandwidth = 2),
> col = "blue", lwd = 3)
> lines(ksmooth(speed, dist, "box", bandwidth = 2),
> col = "darkorange", lwd = 3)
> })
> legend("topleft", c("Normal Kernel with h=2", "Box Kernel with h=2"),
> lwd = c(2,2),
> col = c("blue","darkorange"), cex = 2)
>
> the curve produced by the box kernel (dark orange) appears to contain
> diagonal line segments rather than the step-like shape I expected. I have
> attached the resulting plot for reference.
>
> My understanding is that the theoretical estimator should behave like a
> step function because the kernel weights are either 0 or 1. Therefore, I
> was wondering whether the diagonal segments arise from how ksmooth()
> evaluates the estimator on a grid of x values and then connects those
> points with straight lines for plotting, or if there is another
> implementation detail that explains this behavior.
>
> Could you please clarify whether this is expected behavior?
>
> Thank you very much for your time.
>
> Best regards,
> Sangeun Song
>
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
Hello,
Use type = "s", see help("plot.default") for the possible values of
argument type.
You have a link to that help page in the documentation of line().
?plot.default
?line
In the code below, I only use it in the 2nd line() call.
# if it's the 1st time you call par(), this does nothing
# (it changes a graphics device from rows*cols == 1*1 to 1*1)
# anyway, save the value so that you can later reset the default
old_par <- par(mfrow = c(1, 1))
# see what mfrow was before
old_par
#> $mfrow
#> [1] 1 1
with(cars, {
plot(speed, dist)
lines(ksmooth(speed, dist, "normal", bandwidth = 2),
col = "blue", lwd = 3)
lines(ksmooth(speed, dist, "box", bandwidth = 2),
type = "s",
col = "darkorange", lwd = 3)
})
legend("topleft", c("Normal Kernel with h=2", "Box Kernel with h=2"),
lwd = c(2,2),
col = c("blue","darkorange"), cex = 2)
# reset the default par values
par(old_par)
Hope this helps,
Rui Barradas
More information about the R-help
mailing list