[英]constrained multiple linear regression in R
假設我必須在回歸中估計系數a,b:
y=a*x+b*z+c
我事先知道y總是在y> = 0和y <= x的范圍內,但回歸模型有時會產生y在此范圍之外。
樣本數據:
mydata<-data.frame(y=c(0,1,3,4,9,11),x=c(1,3,4,7,10,11),z=c(1,1,1,9,6,7))
round(predict(lm(y~x+z,data=mydata)),2)
1 2 3 4 5 6
-0.87 1.79 3.12 4.30 9.34 10.32
第一預測值<0。
我嘗試了沒有攔截的模型:所有預測都是> 0,但y的第三個預測> x(4.03> 3)
round(predict(lm(y~x+z-1,data=mydata)),2)
1 2 3 4 5 6
0.76 2.94 4.03 4.67 8.92 9.68
我還考慮建模比例 y / x而不是y:
mydata$y2x<-mydata$y/mydata$x
round(predict(lm(y2x~x+z,data=mydata)),2)
1 2 3 4 5 6
0.15 0.39 0.50 0.49 0.97 1.04
round(predict(lm(y2x~x+z-1,data=mydata)),2)
1 2 3 4 5 6
0.08 0.33 0.46 0.47 0.99 1.07
但現在第六次預測> 1,但比例應在[0,1]范圍內。
我還嘗試應用glm
與offset
選項一起使用的方法: R中的Rate變量的回歸和http://en.wikipedia.org/wiki/Poisson_regression#.22Exposure.22_and_offset,但這不成功。
請注意,在我的數據因變量中:比例y / x既是零膨脹又是一膨脹。 任何想法,在R('glm','lm')中建立模型的合適方法是什么?
你是在正確的軌道上:如果0≤y≤x則0≤(y / x)≤1。這表明將y/x
擬合為glm(...)
的邏輯模型。 詳情如下,但考慮到你只得到6分,這是一個非常合適的選擇。
主要問題是該模型無效,除非(y/x)
的誤差為常數且具有常數方差(或等效地,y中的誤差隨x增加)。 如果這是真的那么我們應該獲得(或多或少)線性QQ圖,我們這樣做。
一個細微差別:glm邏輯模型的接口需要兩列y:“成功次數(S)”和“失敗次數(F)”。 然后計算概率為S /(S + F)。 所以我們必須提供兩個模仿這個的列:y和xy。 然后glm(...)
將計算y/(y+(xy)) = y/x
。
最后,擬合總結表明x很重要,z可能也可能不是。 您可能想嘗試排除z的模型,看看是否可以改善AIC。
fit = glm(cbind(y,x-y)~x+z, data=mydata, family=binomial(logit))
summary(fit)
# Call:
# glm(formula = cbind(y, x - y) ~ x + z, family = binomial(logit),
# data = mydata)
# Deviance Residuals:
# 1 2 3 4 5 6
# -0.59942 -0.35394 0.62705 0.08405 -0.75590 0.81160
# Coefficients:
# Estimate Std. Error z value Pr(>|z|)
# (Intercept) -2.0264 1.2177 -1.664 0.0961 .
# x 0.6786 0.2695 2.518 0.0118 *
# z -0.2778 0.1933 -1.437 0.1507
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# (Dispersion parameter for binomial family taken to be 1)
# Null deviance: 13.7587 on 5 degrees of freedom
# Residual deviance: 2.1149 on 3 degrees of freedom
# AIC: 15.809
par(mfrow=c(2,2))
plot(fit) # residuals, Q-Q, Scale-Location, and Leverage Plots
mydata$pred <- predict(fit, type="response")
par(mfrow=c(1,1))
plot(mydata$y/mydata$x,mydata$pred,xlim=c(0,1),ylim=c(0,1), xlab="Actual", ylab="Predicted")
abline(0,1, lty=2, col="blue")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.