This is an example application to compare the accuracy and computational speed of DRR for different parameters to PCA.
library(DRR)
data(iris)
in_data <- iris[,1:4]
npoints <- nrow(in_data)
nvars <- ncol(in_data)
for (i in seq_len(nvars)) in_data[[i]] <- as.numeric(in_data[[i]])
my_data <- scale(in_data[sample(npoints),], scale = FALSE)
t0 <- system.time(pca <- prcomp(my_data, center = FALSE, scale. = FALSE))
t1 <- system.time(drr.1 <- drr(my_data))
t2 <- system.time(drr.2 <- drr(my_data, fastkrr = 2))
t3 <- system.time(drr.3 <- drr(my_data, fastkrr = 5))
t4 <- system.time(drr.4 <- drr(my_data, fastkrr = 2, fastcv = TRUE))
rmse <- matrix(NA_real_, nrow = 5, ncol = nvars, dimnames = list(c("pca", "drr.1",
"drr.2", "drr.3", "drr.4"), seq_len(nvars)))
for (i in seq_len(nvars)) {
pca_inv <- pca$x[, 1:i, drop = FALSE] %*% t(pca$rotation[, 1:i, drop = FALSE])
rmse["pca", i] <- sqrt(sum((my_data - pca_inv)^2))
rmse["drr.1", i] <- sqrt(sum((my_data - drr.1$inverse(drr.1$fitted.data[,
1:i, drop = FALSE]))^2))
rmse["drr.2", i] <- sqrt(sum((my_data - drr.2$inverse(drr.2$fitted.data[,
1:i, drop = FALSE]))^2))
rmse["drr.3", i] <- sqrt(sum((my_data - drr.3$inverse(drr.3$fitted.data[,
1:i, drop = FALSE]))^2))
rmse["drr.4", i] <- sqrt(sum((my_data - drr.4$inverse(drr.4$fitted.data[,
1:i, drop = FALSE]))^2))
}
More blocks for fastkrr speed up calculation, too are bad for accuracy.
## 1 2 3 4
## pca 7.166770 3.899313 1.884524 1.732772e-14
## drr.1 5.469965 3.458503 1.709825 1.675732e-14
## drr.2 5.478541 3.487811 1.645224 1.674559e-14
## drr.3 5.552791 3.499912 1.668842 1.674177e-14
## drr.4 5.570917 3.690015 1.642986 1.674143e-14
## user.self sys.self elapsed
## pca 0.000 0.000 0.001
## drr.1 30.412 51.860 24.329
## drr.2 20.200 34.372 15.491
## drr.3 39.788 67.140 32.411
## drr.4 22.648 21.956 19.565