R 向线性回归模型中添加边界条件

R 向线性回归模型中添加边界条件,r,lm,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) 这不再是线性模型,因为输出中会有一个弯曲,因

是否可以将边界条件添加到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)

这不再是线性模型,因为输出中会有一个弯曲,因此不能使用
lm
。但是,您可以使用公式中的
pmax
使用
nls
函数(非线性最小二乘法)来实现这一点

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


weight这不再是一个线性模型,因为输出会有一个弯曲,所以不能使用
lm
。但是,您可以使用公式中的
pmax
使用
nls
函数(非线性最小二乘法)来实现这一点

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


weight您可以使用日志链接函数来完成此操作。尝试使用
glm()
指定日志链接。

您可以使用日志链接函数来完成此操作。尝试使用
glm()
指定一个日志链接。

请注意,边界条件的检查可以变得更加优雅(并且计算速度更快)作为
result@Patronus,我考虑在
lm
内部实现它,因为有一个汇总函数-我在一个循环中有很多模型,直接从模型参数收集输出参数非常重要faster@plotr预测值的输出(设置为零)与summary函数()有什么关系?摘要输出不包含拟合值。或者是你担心斜率和截距可能不同(如果有质量预测值为负值,它们确实会不同!)@Patronus抱歉,我是说系数,我不确定使用拟合系数的拟合模型是否最有效,在数学上是否正确,然后检查边界-但在预测未来值时,仍然使用拟合系数(以及之后的边界声明)。或者我应该首先拟合模型,然后检查边界条件,然后再次拟合模型,使其符合边界条件?a在这里不适用吗?请注意,边界条件的检查可以变得更加优雅(并且计算速度更快)作为
result@Patronus,我考虑在
lm
内部实现它,因为有一个汇总函数-我在一个循环中有很多模型,直接从模型参数收集输出参数非常重要faster@plotr预测值的输出(设置为零)与summary函数()有什么关系?摘要输出不包含拟合值。或者是你担心斜率和截距可能不同(如果有质量预测值为负值,它们确实会不同!)@Patronus抱歉,我是说系数,我不确定使用拟合系数的拟合模型是否最有效,在数学上是否正确,然后检查边界-但在预测未来值时,仍然使用拟合系数(以及之后的边界声明)。或者我应该首先拟合模型,然后检查边界条件,然后再次拟合模型,使其符合边界条件?a不适用于这里吗?这正是我想要的:)PS。有没有办法优化选择nls参数的过程-选择尽可能最好的AUTMATICALI?@piotr太好了!一般情况下不是这样,但在这种情况下,我建议从lm()参数开始;他们可能会很接近。(在这样一个简单的双参数模型中,我想很难得到它,因为模型不收敛)这正是我想要的:)PS.有没有办法优化选择nls参数的过程-选择尽可能最好的AUTMATICALI?@piotr很棒!一般情况下不是这样,但在这种情况下,我建议从lm()参数开始;他们可能会很接近。(在这样一个简单的双参数模型中,我想如果模型不收敛,就很难得到它)
result <- t$residuals + weight$mass
check <- function(x){
  if(x < 0){
    return(0)
  }
    return(x)
}
sapply(result, check)
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")