如何修复glm的拦截值

时间:2014-12-29 11:32:21

标签: r glm intercept 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

我的问题是:

glm函数有一个选项允许我用我想要的值来修正拦截系数?并预测x值?

例如:我希望我的曲线从上面开始&#34; Y&#34;值==&gt;我想用log(300)

更改截距

2 个答案:

答案 0 :(得分:4)

data2 <- data.frame( X = c(0,2,4,6,8,10),
                Y = c(300,220,210,90,80,10)
m1 <- lm(log(Y)~X-1+offset(rep(log(300),nrow(data2))),data2)

有一个predict()函数,但在这里手动预测可能更容易。

par(las=1,bty="l")
plot(Y~X,data=data2)
curve(300*exp(coef(m1)*x),add=TRUE)

enter image description here

对于它的价值,如果你想比较log-Normal和Poisson模型,你可以通过

来做到这一点。
library("ggplot2")
 theme_set(theme_bw())
 ggplot(data2,aes(X,Y))+geom_point()+
    geom_smooth(method="glm",family=quasipoisson)+
    geom_smooth(method="glm",family=quasi(link="log",var="mu^2"),
      colour="red",fill="red")

enter image description here

答案 1 :(得分:4)

您错误地使用glm(...),哪个IMO比偏移更大的问题。

最小二乘回归的主要基本假设是响应中的误差通常以恒定方差分布。如果Y中的错误是正态分布的,那么log(Y)肯定不会。所以,虽然你可以&#34;运行数字&#34;在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

特别是,使用正确的方法时,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的数据。 }。我想知道这是不是你想要&#34;修复&#34;拦截。看看另一个答案,你可以看到,当你确定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")

这里,蓝色曲线是无约束拟合(正确完成),绿色曲线是拟合约束Y 0 = 300.你可以看到它们没有太大差别,因为正确(无约束)适合已经相当不错了。