2014-12-29 52 views
2

的截距值。這是我在這工作的例子:如何修復GLM

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值?

例如:我想,我的曲線開始上「Y」值==>我想改變截距log(300)

+1

'模型< - LM(日誌(Y)〜X-1 +偏移(代表(日誌(300),nrow(DATA2))),DATA2)'; ?'predict' –

+0

我想在這裏,我有:Y = AX + B, B =日誌(300), A = $模型係數? ,我有生物學背景,這一切都是新的,我#Thanks – Cherif

回答

4

您正在使用glm(...)錯誤地做到這一點,國際海事組織是一個比抵消更大的問題。

最小二乘迴歸的主要基本假設是響應中的誤差正態分佈且方差不變。如果Y中的錯誤是正態分佈的,那麼log(Y)肯定不是。所以,雖然你可以在「log(Y)~X」上運行數字,但結果並不會有意義。廣義線性建模理論被開發來處理這個問題。所以使用glm,而不是合適的log(Y) ~X你應該適合Y~Xfamily=poisson。前者配合

日誌(Y)= B + B X

而後者配合

Y = EXP(B + B x)

在後一種情況下,如果Y中的錯誤是正態分佈的,並且模型是有效的,那麼根據需要殘差將是正態分佈的。請注意,這兩種方法給出非常不同的結果對於b 和b 。

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。我想知道這是爲什麼你要「修理」攔截。看另一個答案,你可以看到,當你修復Y = 300時,擬合低估了整個過程。

相比之下,我們來看看使用glm正確修復Y 會發生什麼。

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") 

這裏,藍色的曲線是不受約束的配合(處理得當),綠色曲線擬合制約Ÿ = 300.你中央社看到,他們不很不同很多,因爲正確的(不受限制的)適合已經相當好了。

+2

我認爲,數轉化反應,即假設數正態分佈的殘差,是*不*一定的誤差。 –

+0

是的,絕對。如果你知道錯誤是正態分佈的,那麼正確的方法是使用'lm(log(Y)〜X)',並且使用'glm(...)'就像我錯誤的方法。您需要查看Q-Q圖,看看哪個方法是正確的。但看看OP的數據 - 使用泊松glm的適合性要好得多。 – jlhoward

+0

我其實不這麼認爲。比較'fit.correct < - GLM(Y〜X,數據DATA2 =,家庭= quasipoisson); coefplot2 :: coefplot2(列表(fit.correct,fit.incorrect),截距= TRUE)'(對不起,'coefplot2' ISN再加上CRAN)表明這些係數並不完全相同; 「小30%」,但是-0.3(SE 0.07)對-0.2(SE 0.04)實際上並沒有顯着差異......(注意我在這裏使用'quasipoisson') –

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

對於它的價值,如果你想比對數正態分佈和泊松模型,您可以通過

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