À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


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

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