我想在中执行非常简单的线性回归R
。公式很简单,如。但是我希望斜率()在1.4到1.6之间。
如何才能做到这一点?
我想在中执行非常简单的线性回归R
。公式很简单,如。但是我希望斜率()在1.4到1.6之间。
如何才能做到这一点?
Answers:
我想在R中执行线性回归。我希望斜率在1.4到1.6之间。如何才能做到这一点?
(i)简单方法:
拟合回归。如果在界限之内,那么您就完成了。
如果不在边界内,则将斜率设置为最近的边界,然后
将截距估计为所有观测值的平均值。
(ii)更复杂的方法:在边坡上用方框约束的最小二乘法;许多优化例程都实现了盒约束,例如nlminb
(R附带)。
编辑:实际上(如下面的示例中所述)在香草R中nls
可以执行框约束;如示例所示,这确实非常容易。
您可以直接使用约束回归。我认为pcls
来自软件包“ mgcv”的nnls
功能和来自软件包“ nnls”的功能都可以。
-
编辑以回答后续问题-
我将向您展示如何将其与nlminb
R一起使用,但是我意识到nls
已经使用相同的例程(PORT例程)来实现约束最小二乘,因此下面的示例就是这种情况。
注意:在下面的示例中,是截距,b是斜率(统计中较常见的约定)。当我把它放在这里后,我意识到你是从另一边开始的。不过,相对于您的问题,我将保留示例“向后”。
首先,设置一些“真”斜率在范围内的数据:
set.seed(seed=439812L)
x=runif(35,10,30)
y = 5.8 + 1.53*x + rnorm(35,s=5) # population slope is in range
plot(x,y)
lm(y~x)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
12.681 1.217
...但是LS估计值远远超出了它,只是由随机变化引起的。因此,让我们使用约束回归nls
:
nls(y~a+b*x,algorithm="port",
start=c(a=0,b=1.5),lower=c(a=-Inf,b=1.4),upper=c(a=Inf,b=1.6))
Nonlinear regression model
model: y ~ a + b * x
data: parent.frame()
a b
9.019 1.400
residual sum-of-squares: 706.2
Algorithm "port", convergence message: both X-convergence and relative convergence (5)
如您所见,您将在边界上得到一个斜率。如果将拟合模型传递给summary
它,甚至会产生标准误差和t值,但我不确定它们的意义/可解释性。
b=1.4
c(a=mean(y-x*b),b=b)
a b
9.019376 1.400000
这是相同的估计...
在下面的图中,蓝线是最小二乘,红线是约束的最小二乘:
nls
它。
Glen_b的第二种方法,使用带有方块约束的最小二乘法,可以通过岭回归更容易地实现。岭回归的解可以看作是拉格朗日回归,其权重向量的范数的大小(及其斜率)受到限制。因此,按照下面的胡布尔的建议,方法是减去趋势(1.6 + 1.4)/ 2 = 1.5,然后应用山脊回归并逐渐增加山脊参数,直到斜率的大小小于或等于0.1。
这种方法的好处是不需要花哨的优化工具,只需使用R(和许多其他软件包)中已经可用的ridge regresson。
但是Glen_b的简单解决方案(i)对我来说似乎很明智(+1)
另一种方法可能是将回归重构为优化问题并使用优化器。我不确定是否可以用这种方式重新定义它,但是当我阅读有关R优化器的博客文章时,想到了这个问题:
http://zoonek.free.fr/blosxom/R/2012-06-01_Optimization.html