非线性拟合回归
Non-linear fit regression
df <- data.frame(hour=c(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23),
total=c(15507,132129,156909,81306,44413,51448,55308,63542,57564,54031,70319,53345,35137,15509,20134,5183,2554,20,203))
plot(df$hour, df$total)
fit1 <- lm(total~hour, data = df)
fit2 <- lm(total~poly(hour,2, raw = TRUE), data = df)
fit3 <- lm(total~poly(hour,3, raw = TRUE), data = df)
fit4 <- lm(total~poly(hour,4, raw = TRUE), data = df)
fit5 <- lm(total~poly(hour,5, raw = TRUE), data = df)
summary(fit1)$adj.r.squared
summary(fit2)$adj.r.squared
summary(fit3)$adj.r.squared
summary(fit4)$adj.r.squared
summary(fit5)$adj.r.squared
如何确定最适合我的数据的回归
如何计算临界点、全局最大值和局部最大值(如果有)。
尝试使用调整后的 r 平方作为选择最佳曲线的基础,但我的临界点与曲线不相关。
“最适合”是一个根据您的目标有多种答案的问题,但是:
AIC(fit1,fit2,fit3,fit4,fit5)
df AIC
fit1 3 450.4892
fit2 4 451.8506
fit3 5 453.3828
fit4 6 454.5851
fit5 7 446.4370
表明 fit5
是最好的(最低 AIC)。 bbmle::AICtab()
给出了一个稍微有用的输出(也许)——只显示 AIC relative 最适合,根据拟合优度对模型进行排序。
bbmle::AICtab(fit1,fit2,fit3,fit4,fit5)
dAIC df
fit5 0.0 7
fit1 4.1 3
fit2 5.4 4
fit3 6.9 5
fit4 8.1 6
如果您的模特是
beta0 + beta1*x + beta2*x^2 + beta3*x^3 ...
那么一阶导数是
beta1 + 2*beta2*x + 3*beta3*x^2 + ...
求这个多项式的根应该给出临界点。
所以例如
pp <- polyroot(coef(fit5)[-1]*(1:5))
应该给你fit5
的临界点。
png("tmp.png")
par(las=1, bty="l")
plot(df$hour, df$total)
lines(df$hour, predict(fit5))
abline(v=Re(pp), col =2 )
dev.off()
多一点实验表明您尚未达到最佳复杂度。使用 AICc(“修正的”AIC,占有限样本量):
bbmle::AICctab(fit5, fit7, fit10)
dAICc df
fit7 0.0 9
fit5 19.1 7
fit10 29.3 12
即order-7(相当)优于 order-5 或 order-10 ...
df <- data.frame(hour=c(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23),
total=c(15507,132129,156909,81306,44413,51448,55308,63542,57564,54031,70319,53345,35137,15509,20134,5183,2554,20,203))
plot(df$hour, df$total)
fit1 <- lm(total~hour, data = df)
fit2 <- lm(total~poly(hour,2, raw = TRUE), data = df)
fit3 <- lm(total~poly(hour,3, raw = TRUE), data = df)
fit4 <- lm(total~poly(hour,4, raw = TRUE), data = df)
fit5 <- lm(total~poly(hour,5, raw = TRUE), data = df)
summary(fit1)$adj.r.squared
summary(fit2)$adj.r.squared
summary(fit3)$adj.r.squared
summary(fit4)$adj.r.squared
summary(fit5)$adj.r.squared
如何确定最适合我的数据的回归
如何计算临界点、全局最大值和局部最大值(如果有)。
尝试使用调整后的 r 平方作为选择最佳曲线的基础,但我的临界点与曲线不相关。
“最适合”是一个根据您的目标有多种答案的问题,但是:
AIC(fit1,fit2,fit3,fit4,fit5)
df AIC
fit1 3 450.4892
fit2 4 451.8506
fit3 5 453.3828
fit4 6 454.5851
fit5 7 446.4370
表明 fit5
是最好的(最低 AIC)。 bbmle::AICtab()
给出了一个稍微有用的输出(也许)——只显示 AIC relative 最适合,根据拟合优度对模型进行排序。
bbmle::AICtab(fit1,fit2,fit3,fit4,fit5)
dAIC df
fit5 0.0 7
fit1 4.1 3
fit2 5.4 4
fit3 6.9 5
fit4 8.1 6
如果您的模特是
beta0 + beta1*x + beta2*x^2 + beta3*x^3 ...
那么一阶导数是
beta1 + 2*beta2*x + 3*beta3*x^2 + ...
求这个多项式的根应该给出临界点。
所以例如
pp <- polyroot(coef(fit5)[-1]*(1:5))
应该给你fit5
的临界点。
png("tmp.png")
par(las=1, bty="l")
plot(df$hour, df$total)
lines(df$hour, predict(fit5))
abline(v=Re(pp), col =2 )
dev.off()
多一点实验表明您尚未达到最佳复杂度。使用 AICc(“修正的”AIC,占有限样本量):
bbmle::AICctab(fit5, fit7, fit10)
dAICc df
fit7 0.0 9
fit5 19.1 7
fit10 29.3 12
即order-7(相当)优于 order-5 或 order-10 ...