【问题标题】:Adding boundary conditions to linear regression model向线性回归模型添加边界条件
【发布时间】:2017-05-10 21:57:57
【问题描述】:

是否可以在 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 &lt; 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)

【问题讨论】:

  • 请注意,您可以像result &lt;- pmax(fitted(t), 0)那样使您对边界条件的检查更加优雅(并且计算速度更快)- 有帮助吗?
  • @Patronus 我正在考虑在lm 内部实现它,因为摘要功能 - 我在一个循环中有很多模型,直接从模型参数收集输出参数要快得多
  • @plotr 预测值的输出(您设置为零的值)与汇总函数()有什么关系?摘要输出不包含拟合值。还是您担心斜率和截距可能不同(如果有大量预测值为负数,它们确实可能不同!)
  • @Patronus 抱歉,我的意思是系数,我不确定使用具有拟合系数的拟合模型并在之后检查边界是否最有效和数学上正确 - 但在预测未来值时仍然使用拟合系数(以及之后的边界声明)。或者我应该先拟合模型,然后检查边界条件,然后再次拟合模型以使其符合边界条件?
  • truncated regression 在这里不适用吗?

标签: r lm


【解决方案1】:

这不再是一个线性模型,因为输出会有一个弯曲,所以你不能使用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

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

library(ggplot2)
weight$linear <- predict(mod_linear)
weight$nonlinear <- predict(mod_nls)

ggplot(weight, aes(size, mass)) +
  geom_point() +
  geom_line(aes(y = linear), color = "red") +
  geom_line(aes(y = nonlinear), color = "blue")

【讨论】:

  • 这正是我想要的:) PS。有没有办法优化选择 nls 参数的过程 - 选择最好的 autmaticaly?
  • @piotr 太棒了!不是在一般情况下,但在这种情况下,我建议从您的 lm() 参数开始;他们可能会足够接近。 (在这么简单的两参数模型中,我想很难让它远离模型不收敛)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 2021-01-11
    • 2020-03-13
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多