我正在尝试找出一种从拟合二次模型中找到最小值/最大值的方法。在这种情况下是最小值。
x.lm <- lm(Y ~ X + I(X^2))
编辑:澄清一下,我已经可以通过 min(predict(x.lm)) 找到最小 y。我怎样才能将其转换为相应的 x 值。
看看这个。想法是你必须从 x.lm fit 中获取拟合值
#example data
X <- 1:100
Y <- 1:100 + rnorm(n = 100, mean = 0, sd = 4)
x.lm <- lm(Y ~ X + I(X^2))
fits <- x.lm$fitted.values #getting fits, you can take residuals,
# and other parameters too
# I guess you are looking for this.
min.fit = min(fits)
max.fit = max(fits)
df <- cbind(X, Y, fits)
df <- as.data.frame(df)
index <- which.min(df$fits) #very usefull command
row.in.df <- df[index,]
虽然已经有了一个公认的答案,但它的缺点是它不能产生拟合曲线的最小值或最大值,而只能产生曲线上的一个随机点,该点恰好是预测变量值的随机样本中的最小值。
正如@Roland 指出的,很容易从拟合系数计算实际极值。请记住,极值的必要条件是导数消失,对于 $y = ax^2 + bx + c$,它产生点 $x = -b/2a$。因此,您可以按如下方式找到极值:
fit <- lm(mpg ~ disp + I(disp^2), data=mtcars)
a <- coef(fit)[3]
b <- coef(fit)[2]
-b/(2*a)
# 419.2907
plot(mpg ~ disp, data=mtcars)
mtcars.sorted <- mtcars[order(mtcars$disp),]
lines(mtcars.sorted$disp, predict(fit, newdata=mtcars.sorted), col="red")
abline(v=-b/(2*a), col="blue")