将边界条件添加到线性回归模型

时间:2017-05-10 21:57:58

标签: r lm

是否可以在R中为lm()模型添加边界条件?

weight <- data.frame(mass = c(0.02, 0, 0.3, 0.05, 0.006, 0.01), size = c(0.5, 0.001, 0.1, 0.2, 0.06, 0.02), density = c(1, 0, 0.05, 0.012, 0.1, 0.01))

t <- lm(mass  ~ size + density, data = weight)

例如,如果result < 0然后result = 0? - 因为质量不可能小于零。

我在撰写?lm后找到了一些信息,但没有示例如何使用它。

  

模型,x,y,qr逻辑。如果为TRUE的相应组件   拟合(模型框架,模型矩阵,响应,QR   分解)返回。

我可以运行模型并在编译后检查边界条件的结果,但也许有更优雅的方式:)

result <- t$residuals + weight$mass
check <- function(x){
  if(x < 0){
    return(0)
  }
    return(x)
}
sapply(result, check)

2 个答案:

答案 0 :(得分:3)

这不再是线性模型,因为输出会有一个弯曲,所以你不能使用var formattedWordsWithCount = []; for (var word in wordsWithCount) { formattedWordsWithCount.push(wordsWithCount[word] + " - " + word); } 。但是,您可以使用lm函数(非线性最小二乘),在公式中使用nls来处理此问题。

为了证明这一点,让我们简化数据,使它只有一个预测器(更容易绘制图形),并且该线明显低于零。

pmax

然后模型的系数大不相同:

weight <- data.frame(mass = c(0, 0, 1, 2, 3), size = c(1, 3, 4, 6, 5))

# simple linear model
mod_linear <- lm(mass  ~ size, data = weight)

# nls; note that you had to take guesses for the parameters.
mod_nls <- nls(mass ~ pmax(intercept + b1 * size, 0),
           weight, start = list(intercept = 0, b1 = 1))

您可以通过绘制两者来看到预测的差异(并且看到非线性版本是数据的更好模型)。

coefficients(summary(mod_linear))
#>               Estimate Std. Error   t value   Pr(>|t|)
#> (Intercept) -0.9054054  0.9404279 -0.962759 0.40668973
#> size         0.5540541  0.2254503  2.457544 0.09106616
coefficients(summary(mod_nls))
#>           Estimate Std. Error   t value Pr(>|t|)
#> intercept     -2.1  1.6062378 -1.307403 0.282250
#> b1             0.8  0.3464102  2.309401 0.104088

答案 1 :(得分:0)

您可以使用日志链接功能来执行此操作。尝试使用glm()指定日志链接。