如何在 R 中保存嵌套循环的结果
How to save the results of a nested loop in R
我有一个包含 15 个变量的数据集(1 个正在检查,14 个是它的回归变量)都是数字。我所做的是 运行 一种算法,它是一种递归预测技术。该算法切割样本内和样本外的数据。 这里我想弄清楚如何存储为 a
和 t
的每个值生成的结果,它们是 cv.hqreg
函数的参数( hqreg package
)。
- 注意: 对于
t and a
的每个值,我们得到 1 个值(代码中的值 predicedQ
。对于每个 t and a
我们 运行 cv.hqreg
648 次。然后再次为 t and a
的下一个值重复 648 次。因此最终结果将是一个 matrix/dataset 的 648 行和231 列。
对于每个 cv.hqreg,我得到 100 个拟合模型,我通过此 LMQ$fit$beta[,which(LMQ$lambda.min==LMQ$lambda)]
命令行从中 select 误差最小的模型。
dataR<-TRAINSET
fittedvaluesQRidge<-NULL
for(i in 1:(nrow(TESTSET)-1)){ #adding a new row and repeat
for(a in seq(0,1,0.1)){ #for each penalty of selection
for(t in seq(0,1,0.05)){ #for each quantile
print(i) #to see it works/or where stops
dataR<-rbind(dataR,TESTSET[i,]) #update dataset
LMQ<-cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",tau=t,alpha = a) #FIT THE Lasso Quantile-MODEL
predictdQR<-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14] #find the forecasts
fittedvaluesQRidge<-c(fittedvaluesQRidge,predictdQR) #then put them in a vector
}
}
}
我用来获取预测值的命令非常广泛,一次使用一个变量。但是,我尝试使用矩阵代数(covariates %*% data
的矩阵,但没有结果,但出现错误:二元运算符的非数字参数。它以一种丑陋的方式工作,但如果有更短的方式我会喜欢所有的帮助。
考虑 sapply()
和 expand.grid()
,因为 sapply
可以采用多个输入列表或向量,类似于嵌套 for
循环,但 returns 是一个矩阵。使用 expand.grid
交叉连接 data.frame 对象中的两个列表,您可以捕获 a
和 t
之间的每个组合:
at_combns <- expand.grid(a=seq(0,1,0.05), t=seq(0,1,0.1))
matpredictdQR <- sapply(seq(nrow(at_combns)), function(j, i){
# UPDATE dataset
dataR <- rbind(TRAINSET, TESTSET[1:i,])
# FIT THE Lasso Quantile-MODEL
LMQ <- cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",
tau=at_combns$t[j], alpha=at_combns$a[j])
predictdQR <-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+
LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+
LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+
LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+
LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+
LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+
LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+
LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+
LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+
LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+
LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+
LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+
LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+
LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+
LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14]
return(predictdQR)
}, seq(nrow(TESTSET)-1))
我有一个包含 15 个变量的数据集(1 个正在检查,14 个是它的回归变量)都是数字。我所做的是 运行 一种算法,它是一种递归预测技术。该算法切割样本内和样本外的数据。 这里我想弄清楚如何存储为 a
和 t
的每个值生成的结果,它们是 cv.hqreg
函数的参数( hqreg package
)。
- 注意: 对于
t and a
的每个值,我们得到 1 个值(代码中的值predicedQ
。对于每个t and a
我们 运行cv.hqreg
648 次。然后再次为t and a
的下一个值重复 648 次。因此最终结果将是一个 matrix/dataset 的 648 行和231 列。
对于每个 cv.hqreg,我得到 100 个拟合模型,我通过此 LMQ$fit$beta[,which(LMQ$lambda.min==LMQ$lambda)]
命令行从中 select 误差最小的模型。
dataR<-TRAINSET
fittedvaluesQRidge<-NULL
for(i in 1:(nrow(TESTSET)-1)){ #adding a new row and repeat
for(a in seq(0,1,0.1)){ #for each penalty of selection
for(t in seq(0,1,0.05)){ #for each quantile
print(i) #to see it works/or where stops
dataR<-rbind(dataR,TESTSET[i,]) #update dataset
LMQ<-cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",tau=t,alpha = a) #FIT THE Lasso Quantile-MODEL
predictdQR<-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14] #find the forecasts
fittedvaluesQRidge<-c(fittedvaluesQRidge,predictdQR) #then put them in a vector
}
}
}
我用来获取预测值的命令非常广泛,一次使用一个变量。但是,我尝试使用矩阵代数(covariates %*% data
的矩阵,但没有结果,但出现错误:二元运算符的非数字参数。它以一种丑陋的方式工作,但如果有更短的方式我会喜欢所有的帮助。
考虑 sapply()
和 expand.grid()
,因为 sapply
可以采用多个输入列表或向量,类似于嵌套 for
循环,但 returns 是一个矩阵。使用 expand.grid
交叉连接 data.frame 对象中的两个列表,您可以捕获 a
和 t
之间的每个组合:
at_combns <- expand.grid(a=seq(0,1,0.05), t=seq(0,1,0.1))
matpredictdQR <- sapply(seq(nrow(at_combns)), function(j, i){
# UPDATE dataset
dataR <- rbind(TRAINSET, TESTSET[1:i,])
# FIT THE Lasso Quantile-MODEL
LMQ <- cv.hqreg(as.matrix(dataR[,-15]),dataR$LHS,method = "quantile",
tau=at_combns$t[j], alpha=at_combns$a[j])
predictdQR <-LMQ$fit$beta[1,which(LMQ$lambda.min==LMQ$lambda)]+
LMQ$fit$beta[2,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,1]+
LMQ$fit$beta[3,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,2]+
LMQ$fit$beta[4,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,3]+
LMQ$fit$beta[5,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,4]+
LMQ$fit$beta[6,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,5]+
LMQ$fit$beta[7,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,6]+
LMQ$fit$beta[8,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,7]+
LMQ$fit$beta[9,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,8]+
LMQ$fit$beta[10,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,9]+
LMQ$fit$beta[11,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,10]+
LMQ$fit$beta[12,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,11]+
LMQ$fit$beta[13,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,12]+
LMQ$fit$beta[14,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,13]+
LMQ$fit$beta[15,which(LMQ$lambda.min==LMQ$lambda)]*TESTSET[i+1,14]
return(predictdQR)
}, seq(nrow(TESTSET)-1))