Closed. This question does not meet Stack Overflow guidelines 。它目前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
1年前关闭。
Improve this question
我正在寻找一种在正约束下进行线性回归的方法,因此遇到了 nnls 方法。但是我想知道如何从 nnls 获得与 lm 对象提供的相同的统计数据。更具体地说,R 平方、akaike 信息标准、p 值和置信区间。
有没有办法在 lm 框架中重新估计,使用偏移量和固定系数不起作用......有没有办法获得这些统计数据?还是通过其他方式创建对系数具有正约束的lm对象?
谢谢
罗曼。
可以看到,使用
为了说明关于残差的观点,我们将 OLS 拟合的残差与该数据的残差与 NNLS 拟合的残差进行比较。
在此数据集中,
想改善这个问题吗?更新问题,以便将其作为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 拟合的同一数据集的残差并不正常。这是因为 y
对 x1
的真正依赖是 -10
,但 NNLS 拟合迫使它为 0。因此,非常大的残差(正负)的比例远高于正态分布的预期。关于r - 获取非负最小二乘 (nnls) 拟合系数的 p 值或置信区间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27178607/
10-12 16:06