我可以在nls()或nnls()之类的函数中创建回归系数的条件吗?

时间:2014-07-08 20:03:07

标签: r regression linear-regression

我最近一直在玩R的回归功能/包。我想知道,有没有办法可以强制我的回归系数与特定值相加?我理解强制系数可能会造成不合适,但我仍然在寻找一种方法。

抱歉,我没有太多代码,因为我没有成功这样做,但我正在尝试这样的事情:

b
     [,1]
[1,]    2
[2,]    6
[3,]    4
[4,]    7
[5,]    8

A
     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    7    5    5
[3,]    5    5    3
[4,]    7    8    9
[5,]    8    9    9

我想要一个函数来使用A

为b创建一个模型
  

constrainedcoefs< - function(A,b,coefsum){

     

适合< - nnls(A,b)

理想情况下

sum(coef(fit)) = coefsum

有没有人知道强制coef(fit)之和为某种用户定义值的方法?或具有此功能的包。我只找到了允许我定义上限和下限的包以及关于获得coef(fit)= 1的方法的一些讨论。

1 个答案:

答案 0 :(得分:2)

如果您有输入数据,如

dd <- structure(list(b = c(2L, 6L, 4L, 7L, 8L), A1 = c(2L, 7L, 5L, 
7L, 8L), A2 = c(3L, 5L, 5L, 8L, 9L), A3 = c(4L, 5L, 3L, 9L, 9L
)), .Names = c("b", "A1", "A2", "A3"), class = "data.frame", row.names = c(NA, 
-5L))

您可以尝试将nls

一起使用
nls(b~a1*A1+a2*A2+(1-a1-a2)*A3, dd, 
    lower=0, upper=1,algorithm="port", 
    start=c(a1=.3, a2=.3))

这里我们要求它们总和为1,所以我们实际上只有两个自由参数。一旦我们知道a1a2,我们就可以找出a3。然后我们使用“端口”算法,它允许我们指定上限和下限,以确保值不低于0或高于1.我得到的数据

Nonlinear regression model
  model: b ~ a1 * A1 + a2 * A2 + (1 - a1 - a2) * A3
   data: dd
    a1     a2 
0.7647 0.0000 
 residual sum-of-squares: 1.059

所以参数是(0.7647,0.0000,0.2353)

当然,这种类型的回归似乎很不寻常,所以要非常小心你根据模型拟合做出的推论。