如何在R中进行约束回归

时间:2018-06-08 18:22:56

标签: r regression

说我有一个简单的回归方程式

lm(y~., newdata=df)

我知道如果我想将截距减少到0,我会写

lm(y+0., newdata=df)

但是,有没有办法产生阶跃回归,同时将每个系数约束到特定范围?例如:

step(lm(y~.>1000, newdata=df)

上述方法不起作用,但有没有办法说产生基本上产生最佳拟合的回归并强制每个系数大于1,000?或者,小于指定范围。

#as per Gautam    
minfunc <- function(coefs){
      out <- sum(sapply(3:314, function(z) return(coefs[z]*test2[, z])))
      return(out)
    }


    par = c(1, 1, 30) # initial value
    lb = c(-1, -1, -300000) # lower bound for coefs
    ub = c(30, 30, 30000) # upper bound 

    result <- hjkb(par = par, fn = minfunc, lower = lb, upper = ub)

谢谢,

1 个答案:

答案 0 :(得分:2)

这是一个应该有效的代码。你需要调整边界等以获得你想要的东西。

library(data.table)
library(dfoptim)

minfunc <- function(coefs){
  # using mtcars as the sample data - you would read in your data here
  df <- as.data.table(mtcars)

  out <- (sum(coefs[1]*df$cyl + coefs[2]*df$wt + coefs[3]) - sum(df$mpg))^2
  return(out)
}


par = c(1, 1, 30) # initial value
lb = c(-1, -1, -300000) # lower bound for coefs
ub = c(30, 30, 30000) # upper bound 

result <- hjkb(par = par, fn = minfunc, lower = lb, upper = ub)

lm比较:

> lm(mpg ~ cyl + wt, data = mtcars)

Call:
lm(formula = mpg ~ cyl + wt, data = mtcars)

Coefficients:
(Intercept)          cyl           wt  
     39.686       -1.508       -3.191  

> result$par
[1]  0.00000 -1.00000 23.30788 
#        cyl       wt constant

结果与预期不同。收敛和最终结果取决于优化算法和初始输入的选择。我使用hjkb作为示例,但它不是最好的算法。您可能希望根据需要尝试不同的算法。