我有一个值向量(x1,x2,x3,x4,x5,x6,x7),我想创建一个最小化新未知向量的向量(y1,y2,y3,y4,y5,y6, y7)这样我可以最小化|| xy || ^ 2。我还想创建这个新的向量,受x1 + x2 + x3 + x4 + x5 = x6和x1 + x2 + x3 + x4 = x7的约束。我尝试使用constrOptim,但我认为我没有正确的输入。任何帮助将不胜感激!
是否最好提出一组值,然后使用nls模型进行预测?我该怎么做?
谢谢!!
答案 0 :(得分:0)
我们假设问题的实际意图是y
是已知的,我们希望得到带有指示约束的x。
请注意,nls不适用于零残留问题,并且因为在问题中没有提供数据我们不知道这是否是这种情况所以我们首先提出两个可以处理它的解决方案然后最终我们为非零残差案例显示nls
。我们使用下面(1)中显示的y
作为(1)和(2)的测试输入,并且它具有零残差。对于(3),nls
解,我们使用不同的y,这不会导致零残差。
以下是一些替代解决方案:
1)lm 我们定义x5_to_x7
将x
的前5个分量映射到整个7元素向量。由于x5_to_x7
是线性运算符,因此它对应于我们形成的矩阵X
,然后在lm
中使用:
# test data
y <- c(1:5, sum(1:5), sum(1:4))
x5_to_x7 <- function(x5) c(x5, sum(x5), sum(x5[1:4]))
X <- apply(diag(5), 1, x5_to_x7)
fm <- lm(y ~ X + 0)
,并提供:
coef(fm)
## X1 X2 X3 X4 X5
## 1 2 3 4 5
all.equal(x5_to_x7(coef(fm)), y)
## [1] TRUE
2)优化或者我们可以通过定义残差平方和函数来使用optim
,并使用optim
y
和{{1}来解决它如上所述:
x5_to_x7
,并提供:
rss <- function(x) sum((y - x5_to_x7(x))^2)
result <- optim(numeric(5), rss, method = "BFGS")
3)nls 如果y为残差不为零,则可以使用问题中建议的> result
$par
[1] 1 2 3 4 5
$value
[1] 5.685557e-20
$counts
function gradient
18 12
$convergence
[1] 0
$message
NULL
> all.equal(x5_to_x7(result$par), y)
[1] TRUE
。
nls