>>>>> 송상은  
>>>>>     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

______________________________________________
[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