References

Load packages

library(tidyverse)

Generate data

set.seed(20170426)

## True underlying function
y_fun <- function(x) {
    5*x^4 - 8*x^3 + 2*x^2 - 0.7*x
}

## Fixed design
data1 <- data.frame(x = seq(from = -1, to = +1, by = 0.05))

## True function
data1$y_true <- y_fun(data1$x)

## With some iid noise
data1$y <- data1$y_true + rnorm(n = length(data1$y_true), mean = 0, sd = 4)

## Check visually
gather(data = data1, key = key, value = value, -x) %>%
    ggplot(data = ., mapping = aes(x = x, y = value, color = key)) +
    geom_point() +
    theme_bw() + theme(legend.key = element_blank())

LOESS fit

data1$loess_0.75_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.75,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.00_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.25_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.25,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.50_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1.50,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.50_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.50,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.10_2 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.10,
          degree = 2,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.75_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.75,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.00_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.25_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.25,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.50_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1.50,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.50_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.50,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.10_1 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.10,
          degree = 1,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.75_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.75,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.00_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : Chernobyl! trL<k 1.5827

## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : Chernobyl! trL<k 1.5827
data1$loess_0.25_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.25,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_1.50_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 1.50,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : Chernobyl! trL<k 1.3663
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric = parametric, : Chernobyl! trL<k 1.3663
data1$loess_0.50_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.50,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict

data1$loess_0.10_0 <-
    loess(formula = y ~ x,
          data = data1,
          span = 0.10,
          degree = 0,
          family = "gaussian",
          method = "loess") %>%
    predict


## Check visually
data1_long <- gather(data = data1, key = key, value = value,
                     -x, -y_true, -y)

data1_long$span <- gsub("^loess_", "", data1_long$key) %>%
    gsub("_.*$", "", .) %>%
    as.numeric

data1_long$degree <- gsub("^loess_", "", data1_long$key) %>%
    gsub("^.*_", "", .) %>%
    as.numeric

ggplot(data = data1_long,
       mapping = aes(x = x, y = value, color = key)) +
    geom_point(mapping = aes(y = y), size = 0.2) +
    geom_line(mapping = aes(y = y_true), size = 0.2) +
    geom_line(size = 1) +
    facet_grid(span ~ degree) +
    scale_color_discrete(guide = FALSE) +
    labs(title = "loess at different degrees (col) and span (row)") +
    theme_bw() + theme(legend.key = element_blank())