【问题标题】:constrained multiple linear regression in RR中的约束多元线性回归
【发布时间】:2014-01-30 22:39:21
【问题描述】:

假设我必须在回归中估计系数 a,b:

y=a*x+b*z+c

我事先知道 y 总是在 y>=0 和 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,但是 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 

我也考虑过用 proportion 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 选项一起使用的方法:Regression for a Rate variable in Rhttp://en.wikipedia.org/wiki/Poisson_regression#.22Exposure.22_and_offset 但这并不成功。

请注意,在我的数据因变量中:y/x 比例既是零膨胀又是一膨胀。 任何想法,在 R ('glm','lm') 中构建模型的合适方法是什么?

【问题讨论】:

  • 您尝试了什么,为什么没有成功,我们是否也能获得作业学分?
  • 如果您提供数据或代表性子集,您更有可能获得帮助,正如@AndyClifton 所说,展示您尝试过的内容。此外,在您的模型中,y 出现在 LHS 和 RHS 上。这是故意的吗?
  • 我会检查产生超出此范围的系数的数据集。为什么坚信他们总是在你的范围内?如果数据是模拟的,我认为他们中的一些人走在边缘没有问题。
  • 这是一个统计问题。您没有提供任何有关 y 实际含义的信息,但我怀疑您应该使用广义线性模型。
  • 我的错误我已经纠正了:y 只在 LHS 上。数据不是模拟的,并且不能违反生成数据规则 0

标签: r regression


【解决方案1】:

您走在正确的轨道上:如果 0 ≤ y ≤ x 则 0 ≤ (y/x) ≤ 1。这建议将 y/x 拟合到 glm(...) 中的逻辑模型。详细信息如下,但考虑到你只有 6 分,这很合适。

主要问题是模型无效,除非(y/x) 中的误差是具有恒定方差的正常(或者,等效地,y 中的误差随着 x 增加)。如果这是真的,那么我们应该得到一个(或多或少)线性 QQ 图,我们这样做了。

一个细微差别:glm 逻辑模型的接口需要两列表示 y:“成功次数 (S)”和“失败次数 (F)”。然后它将概率计算为 S/(S+F)。所以我们必须提供两个模拟这个的列:y 和 x-y。然后glm(...) 将计算y/(y+(x-y)) = 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")

【讨论】:

  • 我还找到了替代方案:glm(y ~ offset(log(x)) + z, family=poisson(link=log),data=mydata ) 或来自library(gamlss) gamlss(y/x ~ x + z, data=mydata,family=BEINF)
猜你喜欢
  • 2018-11-18
  • 2013-09-05
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
相关资源
最近更新 更多