簡體   English   中英

R中的約束多元線性回歸

[英]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]范圍內。

我還嘗試應用glmoffset選項一起使用的方法: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM