是否可以在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)
答案 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()
指定日志链接。