使用R在线性模型中设置约束

时间:2018-09-24 22:24:04

标签: r

我正在尝试使用以下线性模型预测未来的市场份额。

    x <- c(20, 60, 80,130)
    y <- c(0.8, 0.15,0.05, 0.0)
    z <-data.frame(x, y)
    z.fit <- lm(y~x, data=z)
    z.prediction <- predict(z.fit, data.frame(x=c(30, 65, 70, 100)), interval="prediction")

结果高于1,请参见以下内容:

      fit
    1 0.544
    2 0.301
    3 0.267
    4 0.059

如何在代码中为“ Share” = 1的总和设置约束?

1 个答案:

答案 0 :(得分:1)

该问题未定义 Share ,但假设它是拟合值,请尝试使用CVXR软件包。请注意,已添加了非负约束,但是如果可接受负值,则可以将其删除。

library(CVXR)

b <- Variable(2)
pred <- b[1] + b[2] * x

objective <- Minimize(sum((y - pred)^2))
constraints <- list(sum(pred) == 1, pred >= 0)
problem <- Problem(objective, constraints)
soln <- solve(problem)

bval <- soln$getValue(b)

bval
##              [,1]
## [1,]  0.565217391
## [2,] -0.004347826

# check constraints

predval <- soln$getValue(pred)
round(predval, 5)
##         [,1]
## [1,] 0.47826
## [2,] 0.30435
## [3,] 0.21739
## [4,] 0.00000

sum(predval)
## [1] 1