在R中运行百分比最小二乘回归

时间:2013-09-13 20:43:25

标签: r regression

我感兴趣的是运行百分比最小二乘回归,而不是R中的普通最小二乘回归。这也可以称为具有乘法误差的线性模型。关于该站点的最小二乘百分比之前已经提出了一个问题,并且响应者建议研究加权回归,一种可能性是通过其X值的倒数平方来加权每个观察。

stackoverflow.com/questions/15275236/least-square-percentage-regression

然而,这假设我知道每个观察应该先验加权多少。我不。我不知道百分比误差是1%,10%,15%等。我想要的是一个适合的模型

y= b1*x + e

将错误术语建模为:

e= b2*x

b2将是回归模型中需要最小化的百分比误差。我无法找到适合R的此类型号的任何包或任何代码。任何有关如何执行此操作的反馈将非常感激。

2 个答案:

答案 0 :(得分:4)

我假设你的意思是由Tofallis (2009)定义的百分比回归。

使用他的例子:

Sales <- c(6375,11626,14655,21869,26408,32406,35108,40295,70762,80553,95294,101314,116141,122316,141650,175026,230614,293543)
Expenses <- c(62.5,92.9,178.3,258.4,494.7,1083,1620.6,421.7,509.2,6620.1,3918.6,1595.3,6107.5,4454.1,3163.8,13210.7,1703.8,9528.2)
  

如果我们将普通最小二乘法与销售额作为依赖项   变量我们获得模型Sales = 43942 + 15.00 R&amp; D with   截距和斜率的p值分别为0.03和0.0015。

fit1 <- lm(Sales ~ Expenses)
summary(fit1)
#                Estimate Std. Error t value Pr(>|t|)   
# (Intercept)   43941.705  18493.079   2.376  0.03033 * 
#   Expenses       14.994      3.915   3.830  0.00148 **
  

如果我们这样做并执行普通的最小二乘,我们就得到了   model:Ln(Sales)= 10.341 + 0.000198 R&amp; D,p值为0.002   对于斜率,截距基本为零。

fit2 <- lm(log(Sales) ~ Expenses)  
summary(fit2)
#                Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   1.034e+01  2.535e-01  40.793  < 2e-16 ***
#   Expenses    1.982e-04  5.366e-05   3.694  0.00197 **
  

最后,我们转向本文介绍的方法,尽量减少   平方百分比残差。结果模型被发现是,   转换后:Sales = 8817 + 17.88 R&amp; D,p值为   斜率和截距分别为0.002和5×10-5。

fit3 <- lm(Sales ~ Expenses, weights = 1/Sales^2)
summary(fit3)
#               Estimate Std. Error t value Pr(>|t|)    
# (Intercept)   8816.553   2421.644   3.641   0.0022 ** 
#   Expenses      17.880      3.236   5.525 4.61e-05 ***

所以,最后,这是加权回归。

为了确认这一点,我们还可以使用数字优化:

resfun <- function(par) {
  sum((Sales - par[[1]]*Expenses - par[[2]])^2 / Sales^2)
}

optim(c(10,1000), resfun)
# $par
# [1]   17.87838 8816.44304

optim(c(10,1000), resfun, method="BFGS")
# $par
# [1]   17.97975 8575.71156

(不同的优化器会产生稍微不同的结果。)

答案 1 :(得分:0)

查看gls包中的nlme功能,以及varClasses之一,例如varIdentvarPower

可能是一个模型:

gls( y ~ x, data=mydata, weights=varPower(form= ~x) )
相关问题