这是我处理它的例子:
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)
答案 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)
对于它的价值,如果你想比较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")
答案 1 :(得分:4)
您错误地使用glm(...)
,哪个IMO比偏移更大的问题。
最小二乘回归的主要基本假设是响应中的误差通常以恒定方差分布。如果Y
中的错误是正态分布的,那么log(Y)
肯定不会。所以,虽然你可以&#34;运行数字&#34;在log(Y)~X
的拟合上,结果将没有意义。为了解决这个问题,开发了广义线性建模理论。因此,使用glm,而不是log(Y) ~X
,您应该Y~X
与family=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.你可以看到它们没有太大差别,因为正确(无约束)适合已经相当不错了。