【发布时间】:2017-08-10 08:32:51
【问题描述】:
我有 4 个数据集(dat、dat2、dat3、dat4),我想构建所有这些数据集的多个线性回归。最后,我需要一个表格来根据 RMSE、r²、RPD 和平均误差来比较模型。我正在使用的代码能够为每个数据集中的每个特征执行单变量模型。就是这样:
dat <- structure(list(TILLER1 = c(43, 23, 46, 30, 30, 45),
LAI1 = c(3.545, 1.5, 1.76, 1.92, 1.36, 1.27),
CHLOR1 = c(447.2, 432.8, 457.6, 449, 486.8, 455),
HEIGHT1 = c(34.8, 31.5, 26.1, 26, 40.5, 35.2 ),
DIAM1 = c(25.23, 23.9, 21.97, 20.99, 23.92, 24.01),
NDRE1 = c(0.2579, 0.1911, 0.1643, 0.2072, 0.2233, 0.2009),
NDVI1 = c(0.6495, 0.4502, 0.3643, 0.4904, 0.5625, 0.4725),
TCH = c(127.55, 142.33, 127.19, 86.64, 144.36, 155.95)),
.Names = c("TILLER1", "LAI1", "CHLOR1", "HEIGHT1", "DIAM1", "NDRE1", "NDVI1", "TCH"),
row.names = c(NA, 6L), class = "data.frame")
### RMSE
rmse <- function(error)
{
sqrt(mean(error^2))
}
# tabel of R², Erro médio, RMSE and RPD
tabel = NULL
for (i in 3:(ncol(dat)-1)) {
## Train control
fitControl <- trainControl (
method = "repeatedcv",
number = 10,
savePredictions = "final")
## Creating all models
set.seed(62433)
reg = train(TCH ~ ., data = dat[, c(i, which(colnames(dat) == "TCH"))],
method = 'lm',
trControl = fitControl,
verbose = TRUE,
importance = TRUE)
mean.error = mean(dat$TCH - data.frame(reg$pred$pred)[, 1])
rpd = sd(dat[, which(colnames(dat) == "TCH")][[1]]) / rmse(residuals(reg))
tmp = data.frame(variable = names(dat[,i]), r2 = summary(reg)$r.squared,
mean_error = mean.error, rmse = rmse(residuals(reg)), rpd = rpd)
if (is.null(tabel)) {
tabel = tmp
} else {
tabel = rbind(tabel, tmp)
}
}
tabel
【问题讨论】:
-
你能澄清一下你想为这个问题实现什么吗?您是否想要一种循环多个数据框以进行回归的方法?如果是这样,这可以通过
for-loops 或lapply轻松完成。 -
我有 4 个数据集。我想构建所有的多元线性回归。它们都具有相同的 Y 变量。作为输出,我想要一个包含以下列的表格:数据集、R²、平均误差、RMSE 和 RPD。
-
所有模型都使用相同的预测变量吗?另外,您使用哪些软件包?
caret? -
我正在使用插入符号。每个数据集都具有相同的属性,但用于不同的评估。我有几个属性:即tiller1,tiller2 tiller3,tiller4和LAI1,LAI2等......所以最后我的数据集dat有tiller1,lai1等,dat2有tiller2,lai2等等。
-
最简单的方法是将代码的
tabel部分包装在一个以dat作为输入的函数中,lapply将它放在你的数据框列表上,然后使用类似@ 987654328@ 创建组合tabel。为了更具体地提供帮助,我需要您提供一些示例数据,例如dput(head(dat))。
标签: r loops linear-regression