Ваша первая проблема уже охвачена этим ответом , поэтому я сосредоточусь на вашей второй проблеме, почему пересечение вашего полиномиального соответствия не соответствует значениям y вашего графика.
Причина в том, что poly
по умолчанию использует ортогональные полиномы, поэтому вам нужно использовать raw=TRUE
. Сравните:
fit.o <- lm(y ~ poly(x, 2, raw=FALSE))
fit.r <- lm(y ~ poly(x, 2, raw=TRUE))
fit.o$coefficients
# (Intercept) poly(x, 2, raw = FALSE)1 poly(x, 2, raw = FALSE)2
# 1.057333 -2.279484 2.376741
fit.r$coefficients
# (Intercept) poly(x, 2, raw = TRUE)1 poly(x, 2, raw = TRUE)2
# 1.62373208 -0.53938558 0.08607933
Коэффициенты различаются, в то время как подогнанные значения такие же.
all.equal(fit.o$fitted.values, fit.r$fitted.values)
# [1] TRUE
На правой панели следующего графика показаны различия. Я использую довольно уродливую xaxs="i"
здесь, чтобы сузить линии к осям.
op <- par(mfrow=c(1, 2))
## left panel
plot(x, y, xaxs="i")
lines(x, predict(fit.r), col=2)
legend("topright", "fit unordered", lty=1, col=2, cex=.8)
## right panel
plot(x, y, xaxs="i")
lines(x[order(x)], predict(fit.r)[order(x)], col=2)
abline(h=fit.o$coefficients[1], lty=2, col=4) ## orthogonal
abline(h=fit.r$coefficients[1], lty=2, col=3) ## raw
legend("topright", c("fit ordered", "raw intercept", "orthog. intercept"),
lty=c(1, 2, 2), col=2:4, cex=.8)
par(op)
введите описание изображения здесь
Как видите, исходный отрезок идеально соответствует отрезку полиномиальной кривой.
Данные игрушки:
x <- with(iris, Petal.Length - min(Petal.Length))
y <- with(iris, Sepal.Width - min(Sepal.Width))