Dear Jeff, Rui, and Martin,

Thank you for the clear explanations. I now fully understand the behavior
and have successfully implemented the solutions.

To summarize what I've learned:

   -

   Cause: The default n.points = 100 in ksmooth() calculates values at
   limited intervals, and the lines() function connects these points with
   diagonal segments.
   -

   Solution 1: Using *type = "s"* in the lines() function forces a
   step-like visualization.
   -

   Solution 2: Increasing to *n.points = 1000* provides a much finer grid,
   making the transitions appear vertical.

Both methods worked perfectly for my experiment. Thank you all again for
your help!

Best regards,
Sangeun Song

2026년 3월 20일 (금) PM 5:28, Martin Maechler <[email protected]>님이 작성:

> >>>>> 송상은
> >>>>>     on Thu, 19 Mar 2026 23:00:00 +0900 writes:
>
>     > 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?
>
> Definitely, as Jeff and Rui explained.
>
> As solution e.g. for teaching / illustration (otherwise the box
> kernel should *never* be used!), I recommend just to evaluate
> the resulting function  on a finer grid, e.g.,  at 1000 instead
> of by default 100 points:
>
>
> ## MM:  evaluate the curve on a much finer grid, using n.points = 1000
> (default was 100)
> with(cars, {
>     plot(speed, dist)
>     lines(ksmooth(speed, dist, "norm", bandwidth = 2, n.points=1000), col
> = "blue", lwd = 3)
>     lines(ksmooth(speed, dist, "box",  bandwidth = 2, n.points=1000), col
> = "darkorange", lwd = 3)
> })
> legend("topleft", c("Normal Kernel with h=2", "Box Kernel with h=2"),
>        lwd = 2, col = c("blue","darkorange"), bty="n")
>
> --
> Martin
>

        [[alternative HTML version deleted]]

______________________________________________
[email protected] 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.

Reply via email to