如何修复glm的截距值

Che*_*rif 2 r intercept glm coefficients

这是我处理它的示例:

data2 = data.frame( X = c(0,2,4,6,8,10),
                    Y = c(300,220,210,90,80,10))
attach(data2)
model <- glm(log(Y)~X)
model

Call:  glm(formula = log(Y) ~ X)

Coefficients:
(Intercept)            X  
     6.0968      -0.2984  

Degrees of Freedom: 5 Total (i.e. Null);  4 Residual
Null Deviance:      7.742 
Residual Deviance: 1.509    AIC: 14.74
Run Code Online (Sandbox Code Playgroud)

我的问题是:

功能上有一个选项glm可以让我用我想要的值修复截距系数?并预测 x 值?

例如:我希望我的曲线以较高的“Y”值开始 ==> 我想改变截距 log(300)

jlh*_*ard 5

您使用glm(...)不正确,IMO 是一个比偏移更大的问题。

最小二乘回归的主要基本假设是响应中的误差以恒定方差正态分布。如果误差Y是正态分布的,那么log(Y)肯定不是。因此,虽然您可以在 的拟合上“运行数字” log(Y)~X,但结果将没有意义。广义线性建模理论就是为了解决这个问题而发展起来的。因此,使用GLM,而不是适合log(Y) ~X你应该适合Y~Xfamily=poisson。前者适合

log(Y) = b 0 + b 1 x

而后者适合

Y = exp(b 0 + b 1 x)

在后一种情况下,如果误差Y呈正态分布,并且模型有效,则残差将按要求呈正态分布。请注意,这两种方法对 b 0 和 b 1给出了非常不同的结果

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
Run Code Online (Sandbox Code Playgroud)

特别是,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")
Run Code Online (Sandbox Code Playgroud)

正确拟合的结果(蓝色曲线)或多或少随机地通过数据,而错误拟合的结果严重高估了 small 的数据,X而低估了 large 的数据X。我想知道这是否就是您要“修复”拦截的原因。查看另一个答案,您可以看到,当您确实修复 Y 0 = 300 时,拟合度始终低估。

相反,让我们看看当我们正确使用 glm修复 Y 0时会发生什么。

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")
Run Code Online (Sandbox Code Playgroud)

这里,蓝色曲线是无约束拟合(正确完成),绿色曲线是约束 Y 0 = 300的拟合。您可以看到它们差别不大,因为正确(无约束)拟合已经很好了。

  • 我认为对响应进行对数转换,即假设对数正态分布残差,*不一定*一定是错误。 (2认同)