Closed. This question does not meet Stack Overflow guidelines 。它目前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

1年前关闭。



Improve this question




我正在寻找一种在正约束下进行线性回归的方法,因此遇到了 nnls 方法。但是我想知道如何从 nnls 获得与 lm 对象提供的相同的统计数据。更具体地说,R 平方、akaike 信息标准、p 值和置信区间。
library(arm)
library(nnls)


data = runif(100*4, min = -1, max = 1)
data = matrix(data, ncol = 4)
colnames(data) = c("y", "x1", "x2", "x3")
data = as.data.frame(data)
data$x1 = -data$y

A = as.matrix(data[,c("x1", "x2", "x3")])
b = data$y

test = nnls(A,b)
print(test)

有没有办法在 lm 框架中重新估计,使用偏移量和固定系数不起作用......有没有办法获得这些统计数据?还是通过其他方式创建对系数具有正约束的lm对象?

谢谢
罗曼。

最佳答案

你提议做的是一个非常糟糕的主意,以至于我不愿意向你展示如何去做。原因是对于 OLS,假设残差是具有恒定方差的正态分布,那么参数估计遵循多元 t 分布,我们可以用通常的方式计算置信限和 p 值。

但是,如果我们对相同的数据进行 NNLS,残差将不会正常分布,计算 p 值等的标准技术会产生垃圾。有一些方法可以估算NNLS拟合参数的置信度极限(例如,请参见this reference),但是它们是近似的,通常依赖于有关数据集的相当严格的假设。

另一方面,如果 lm 对象的一些更基本的函数(例如 predict(...)coeff(...)residuals(...) 等)也适用于 NNLS 拟合的结果,那就太好了。因此,实现这一点的一种方法是使用 nls(...) :仅仅因为模型在参数中是线性的,并不意味着您不能使用非线性最小二乘法来查找参数。如果您使用 nls(...) 算法,port 提供了设置参数下限(和上限)的选项。

set.seed(1)   # for reproducible example
data   <- as.data.frame(matrix(runif(1e4, min = -1, max = 1),nc=4))
colnames(data) <-c("y", "x1", "x2", "x3")
data$y <- with(data,-10*x1+x2 + rnorm(2500))

A <- as.matrix(data[,c("x1", "x2", "x3")])
b <- data$y
test <- nnls(A,b)
test
# Nonnegative least squares model
# x estimates: 0 1.142601 0
# residual sum-of-squares: 88391
# reason terminated: The solution has been computed sucessfully.

fit <- nls(y~b.1*x1+b.2*x2+b.3*x3,data,algorithm="port",lower=c(0,0,0))
fit
# Nonlinear regression model
#   model: y ~ b.1 * x1 + b.2 * x2 + b.3 * x3
#    data: data
#   b.1   b.2   b.3
# 0.000 1.143 0.000
#  residual sum-of-squares: 88391

可以看到,使用 nnls(...) 的结果和使用 nls(...)lower-c(0,0,0) 的结果是一样的。但是 nls(...) 产生一个 nls 对象,它支持(大部分)与 lm 对象相同的方法。所以你可以写 precict(fit)coef(fit)residuals(fit)AIC(fit) 等等。你也可以写 summary(fit)confint(fit) 但要注意:你得到的值没有意义!!!

为了说明关于残差的观点,我们将 OLS 拟合的残差与该数据的残差与 NNLS 拟合的残差进行比较。
par(mfrow=c(1,2),mar=c(3,4,1,1))
qqnorm(residuals(lm(y~.,data)),main="OLS"); qqline(residuals(lm(y~.,data)))
qqnorm(residuals(fit),main="NNLS"); qqline(residuals(fit))

在此数据集中,y 中可变性的随机部分设计为 N(0,1),因此 OLS 拟合的残差(左侧的 Q-Q 图)是正常的。但是使用 NNLS 拟合的同一数据集的残差并不正常。这是因为 yx1 的真正依赖是 -10 ,但 NNLS 拟合迫使它为 0。因此,非常大的残差(正负)的比例远高于正态分布的预期。

关于r - 获取非负最小二乘 (nnls) 拟合系数的 p 值或置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27178607/

10-12 16:06