Um das von @cbeleites erwähnte Problem der numerischen Stabilität zu veranschaulichen, ist hier ein Beispiel von Simon Wood, wie man "bricht" lm()
. Zuerst generieren wir einige einfache Daten und passen eine einfache quadratische Kurve an.
set.seed(1); n <- 100
xx <- sort(runif(n))
y <- .2*(xx-.5)+(xx-.5)^2 + rnorm(n)*.1
x <- xx+100
b <- lm(y ~ x+I(x^2))
plot(x,y)
lines(x, predict(b), col='red')
Aber wenn wir 900 zu X addieren, sollte das Ergebnis so ziemlich dasselbe sein, außer nach rechts verschoben, nein? Leider nicht...
X <- x + 900
B <- lm(y ~ X+I(X^2))
plot(X,y)
lines(X, predict(B), col='blue')
Bearbeiten , um den Kommentar von @Scortchi zu ergänzen. Wenn wir das von lm () zurückgegebene Objekt betrachten, sehen wir, dass der quadratische Term nicht geschätzt wurde und als NA angezeigt wird.
> B
Call:
lm(formula = y ~ X + I(X^2))
Coefficients:
(Intercept) X I(X^2)
-139.3927 0.1394 NA
Und tatsächlich, wie von @Scortchi vorgeschlagen, "bricht" es, wenn wir uns die Modellmatrix ansehen und versuchen, sie direkt zu lösen.
> X <- model.matrix(b) ## get same model matrix used above
> beta.hat <- solve(t(X)%*%X,t(X)%*%y) ## direct solution of ‘normal equations’
Error in solve.default(t(X) %*% X, t(X) %*% y) :
system is computationally singular: reciprocal condition number = 3.9864e-19
Allerdings lm()
gibt mir keine Warnung oder Fehlermeldung anders als die NA
s auf der I(X^2)
Linie des summary(B)
in R-3.1.1. Andere Algorithmen können natürlich auf unterschiedliche Weise mit unterschiedlichen Beispielen "gebrochen" werden.