我有一个 lm 模型,其死亡率数据取决于每日温度。为了估计对气候变化的可能适应,我想将曲线的斜率降低 10%。因此,我通过乘以 0.9 来修改 lm 模型的斜率系数。
然而,这个修改后的模型的预测输出是出乎意料的。斜率下降,但曲线不是在 x=0 处相交,而是在大约 0 处的截距处相交。133.那就是下一个问题,为什么这个截距不是0?
这是一个可重现的示例:
x <- seq(0, 20, 0.1)
y <- seq(0, 20, 0.1)^2
mod <- lm(y ~ poly(x, 2))
mod$coefficients
(Intercept) poly(x, 2)1 poly(x, 2)2
133.6667 1645.2355 426.9008
mody <- mod
mody$coefficients[2] <- mody$coefficients[2]*0.9
mody$coefficients[3] <- mody$coefficients[3]*0.9
mody$coefficients
Intercept) poly(x, 2)1 poly(x, 2)2
133.6667 1480.7120 384.2108
plot(x, predict(mod), type="l")
lines(x, predict(mody), col="red")
我试图找出偏移输出的原因,我认为它在 predict() 函数中的某个地方。为了检查修改后的系数,我尝试了这个,它显示了扩展输出。
curve(coef(mod)[1] + coef(mod)[2] * x + coef(mod)[3] * x^2, from=0, to=20, xlab="x", ylab="y")
curve(coef(mody)[1] + coef(mody)[2] * x + coef(mody)[3] * x^2, from=0, to=20,xlab="x", ylab="y", add = T)
为什么预测输出不同?
为什么示例的 Intercept 不为 0?
或者如何在不使用 predict() 的情况下“手动”“预测”修改后的数据?
谢谢你的帮助!
编辑:DaveArmstrong 的答案通过在 poly() 中使用 raw=TRUE 解决了第一个示例的问题。但是,对于其他数据,它仍然无法正常工作,可能是由于模型中的负系数(?)
这是我的原始数据的一个例子:
x <- seq(15.0, 23.5, 0.1)
y <- c(0.992, 0.998, 1.012, 1.013, 1.015, 1.021, 1.028, 1.027, 1.023, 1.029, 1.032, 1.032, 1.029, 1.036, 1.035, 1.041, 1.043, 1.043, 1.037, 1.037, 1.039, 1.037, 1.041, 1.047, 1.047, 1.048, 1.045, 1.048, 1.044, 1.037, 1.046, 1.042, 1.037, 1.034, 1.032, 1.031, 1.030, 1.034,
1.044, 1.046, 1.036, 1.034, 1.049, 1.050, 1.037, 1.041, 1.046, 1.062, 1.077, 1.084, 1.091, 1.106, 1.114, 1.127, 1.120, 1.122, 1.130,
1.122, 1.135, 1.164, 1.187, 1.186, 1.195, 1.201, 1.197, 1.204, 1.201, 1.205, 1.203, 1.200, 1.205, 1.232, 1.218, 1.218, 1.249, 1.245,
1.253, 1.227, 1.232, 1.252, 1.258, 1.254, 1.248, 1.245, 1.261, 1.289)
org <- lm(y ~ poly(x, 2, raw=TRUE))
coef(org)
(Intercept) poly(x, 2, raw = TRUE)1 poly(x, 2, raw = TRUE)2
2.240583377 -0.153426285 0.004822839
orgm <- org
orgm$coefficients[2] <- orgm$coefficients[2]*1.1 #reducing negative coefficient
orgm$coefficients[3] <- orgm$coefficients[3]*0.9
plot(predict(org), ylim=c(0,1.5), type="l")
lines(predict(orgm), col="red")
legend("topleft", legend=c("Original", "Modified"), col=c("black", "red"), lty=c(1,1))
在结果图 ( plot ) 中,修改后的模型以某种方式转移到较低的 y 值,并且斜率也似乎不正确。为什么这仍然出乎意料?