r - 带约束的最小二乘
问题描述
我想使用伯恩斯坦多项式运行多项式最小二乘回归。根据 Wang 和 Ghosh (2012) 的说法,这些多项式可以通过在回归中添加以下约束来约束为单调递减和凸的:
我按照此处的示例使用 limSolve 估计回归。到目前为止,这是我的代码:
hr <- c(9.0, 9.5, 10.0, 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0,
16.5, 17.0, 17.5, 18.0, 18.5, 19.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0, 22.5, 23.0, 23.5,
24.0, 24.5, 25.0, 25.5, 26.0, 26.5, 27.0, 27.5, 28.0, 28.5, 29.0, 29.5, 30.0, 30.5, 31.0,
31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 38.5,
39.0, 39.5)
fq <- c( 305, 310, 303, 236, 266, 241, 268, 222, 235, 230, 189, 191, 193, 162, 184, 170, 145, 147, 165,
142, 155, 158, 130, 135, 122, 125, 126, 131, 117, 109, 112, 122, 104, 101, 76, 102, 97, 82,
78, 78, 62, 96, 77, 73, 71, 81, 86, 85, 81, 68, 64, 73, 69, 53, 61, 66, 54,
55, 46, 53, 48, 65)
dat <- data.frame(hr=hr, fq=fq)
b0 <- (1-hr)^4
b1 <- 4*hr*(1-hr)^3
b2 <- 6*hr^2*(1-hr)^2
b3 <- 4*hr^3*(1-hr)
b4 <- hr^4
library(Matrix)
library(limSolve)
A <- cbind(b0, b1, b2, b3, b4)
b <- fq
G <- matrix(nrow=4, ncol=5, byrow = TRUE, data = c(-1, 1, 0, 0, 0,
1, -2, 1, 0, 0,
0, 1, -2, 1, 0,
0, 0, 1, -2, 1))
h <- rep(0,4)
B_c <- lsei(A = A, B = b, G = G, H = h, type=2)
# predictions:
my_predict <- function(hr,coefficients){
X <- cbind(cbind(b0, b1, b2, b3, b4))
predictions <- X%*%coefficients
}
# compute predictions
xpred <- seq(0,1,len=62)
dat$pred <- my_predict(xpred,B_c$X)
# plot results
library(ggplot2)
p <- ggplot(data = dat, aes(x = hr, y = fq)) +
geom_point() +
geom_line(data = dat, aes(x = hr, y = pred, color = "constrained fit"))
p
这运行良好,但预测的曲线不是单调的或凸的。所以肯定有什么问题。
编辑:
我尝试使用没有约束的最小二乘法运行相同的回归。两个回归的系数(1. w/o 约束,2. w/约束)似乎非常不同。约束是否有可能部分起作用但不完全起作用?
# without the constraint:
X <- cbind(b0, b1, b2, b3, b4)
B<- lm(fq ~ X, data=dat)
coefs <- cbind(B_c$X, B$coefficients)
解决方案
推荐阅读
- github - 将 Github 项目与 Gitlab 连接
- javascript - Javascript动态表单:如何基于字典对象创建动态表单?
- python - 需要一些帮助来识别 HTML 标记,以便我提取所有相关的标题、链接和 img URL。我的代码当前显示 1
- python - 通过 Google Colab 访问 WRDS 数据:OperationalError
- javascript - 从模块中获取 id_product (Prestashop 1.7)
- javascript - React 受控组件无法设置更改文本输入
- javascript - Bootstrap 5 模态冲突
- asp.net-core - 每天上午 12 点和下午 12 点在 .net 核心中使用 Quartz 作业调度程序
- arrays - 如何在 Golang 中返回一个未知类型的数组?
- asp.net-mvc - 使用 jquery.validation.js 时提交按钮不发布数据