Werken met R bij wiskunde: Regressieanalyse in R
Enkelvoudige lineaire regressie in het algemeen
We hebben de enkelvoudige lineaire regressie bekeken in het geval dat meetgegevens zo goed mogelijk met een rechte lijn beschreven worden. Hierbij is het louter en alleen van belang dat de te schatten parameters lineair in de formule voor komen.
Je mag bijvoorbeeld ook gegevens benaderen via een formule zoals \(y= \beta_0+\beta_1\cdot \ln(x)\) of meerdere parameters toelaten zoals in \(y= \beta_0+\beta_1 x + \beta_2 x^2+\beta_3 x^3\). Onderstaande gerandomiseerde voorbeelden illustreren dit.
y = a + b·ln(x)
Onderstaand R script levert het getoonde diagram op.
ln <- function(x) { value <- log(x, base=exp(1)) return(value) }
# genereer random data met ruis
x <- seq(from=1, to=20, by=1)
a <- runif(1, min=1, max=10)
b <- runif(1, min=0, max=5) y <- a+ b*ln(x) + rnorm(20, mean=0, sd=1) # enkelvoudige lineaire regressie fit <- lm(formula = y ~ ln(x)) # Visualisatie van data + regressielromme plot(x, y, type = "p", pch = 16, col = "red", cex = 1.3, main = "regressiekromme y = a + b*ln(x)")) lines(x, predict(fit), type="l", col="blue", lwd=2)
y = a + b·x + c·x² + d·x³
Onderstaand R script levert het getoonde diagram op. In dit script is het functievoorschrift dus een lineaire combinatie van de constante functie \(1\), \(x\), \(x^2\) en \(x^3\), waarbij de laatste twee afhankelijkheden worden gespecificeerd met een "as is" constructie I(x^2)
en I(x^3)
om er voor te zorgen dat de rekenkundige operaties goed geïnterpreteerd worden. Als alternatief hadden we poly(x, 3, raw=TRUE)
kunnen gebruiken.
x <- seq(from=-2, to=2, by=0.2)
b0 <- runif(1, min=1, max=4)
b1 <- runif(1, min=-2, max=2)
b2 <- runif(1, min=1, max=2)
y <- b0 + b1*x + b2*x^2 + x^3 + rnorm(21, mean=0, sd=0.5)
# enkelvoudige lineaire regressie
fit <- lm(formula = y ~ 1 + x + I(x^2) + I(x^3))
# visualistatie van data + regressielijn
plot(x, y, type = "p", pch = 16, col = "red", cex = 1.3,
main = "regressiekromme y = a + b*x + c*x^2 + d*x^3")
lines(x, predict(fit), type="l", col="blue", lwd=2)