您错误地使用了glm(...),这在 IMO 中是一个比偏移量更大的问题。
最小二乘回归的主要基本假设是响应中的误差呈正态分布,方差不变。如果Y 中的错误是正态分布的,那么log(Y) 肯定不是。因此,虽然您可以在log(Y)~X 上“运行数字”,但结果将没有意义。广义线性建模理论就是为了解决这个问题而发展起来的。所以使用glm,而不是适合log(Y) ~X,你应该适合Y~X和family=poisson。前者适合
log(Y) = b0 + b1x
后者适合
Y = exp(b0 + b1x)
在后一种情况下,如果Y 中的误差呈正态分布,并且模型有效,则残差将按要求呈正态分布。请注意,这两种方法对于 b0 和 b1 给出了非常不同的结果。
fit.incorrect <- glm(log(Y)~X,data=data2)
fit.correct <- glm(Y~X,data=data2,family=poisson)
coef(summary(fit.incorrect))
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 6.0968294 0.44450740 13.71592 0.0001636875
# X -0.2984013 0.07340798 -4.06497 0.0152860490
coef(summary(fit.correct))
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) 5.8170223 0.04577816 127.06982 0.000000e+00
# X -0.2063744 0.01122240 -18.38951 1.594013e-75
尤其是,X 的系数在使用正确的方法时几乎减小了 30%。
注意模型有何不同:
plot(Y~X,data2)
curve(exp(coef(fit.incorrect)[1]+x*coef(fit.incorrect)[2]),
add=T,col="red")
curve(predict(fit.correct, type="response",newdata=data.frame(X=x)),
add=T,col="blue")
正确拟合的结果(蓝色曲线)或多或少随机地通过数据,而错误拟合的结果严重高估了较小的X 的数据,而低估了较大的X 的数据。我想知道这是否就是您要“修复”拦截的原因。查看另一个答案,您可以看到当您修复 Y0 = 300 时,整个拟合都被低估了。
相比之下,让我们看看当我们正确使用 glm 修复 Y0 时会发生什么。
data2$b0 <- log(300) # add the offset as a separate column
# b0 not fixed
fit <- glm(Y~X,data2,family=poisson)
plot(Y~X,data2)
curve(predict(fit,type="response",newdata=data.frame(X=x)),
add=TRUE,col="blue")
# b0 fixed so that Y0 = 300
fit.fixed <-glm(Y~X-1+offset(b0), data2,family=poisson)
curve(predict(fit.fixed,type="response",newdata=data.frame(X=x,b0=log(300))),
add=TRUE,col="green")
这里,蓝色曲线是无约束拟合(正确完成),绿色曲线是约束 Y0 = 300 的拟合。您可以看到它们差别不大,因为正确(无约束)的拟合已经相当不错了。