From 7ccdde87e8f28c03f9d185466488baacd3e8b4da Mon Sep 17 00:00:00 2001 From: wbonat <wbonat@gmail.com> Date: Wed, 6 Jan 2016 18:58:43 +0100 Subject: [PATCH] Remove the following functions - mc_fast_forward.R - mc_influence.R - mc_qic.R - mc_qll.R - mc_rw1.R - mc_rw2.R - mc_unstructured.R --- R/mc_fast_forward.R | 49 ----------------- R/mc_influence.R | 128 -------------------------------------------- R/mc_qic.R | 39 -------------- R/mc_qll.R | 37 ------------- R/mc_rw1.R | 29 ---------- R/mc_rw2.R | 31 ----------- R/mc_unstructured.R | 22 -------- 7 files changed, 335 deletions(-) delete mode 100644 R/mc_fast_forward.R delete mode 100644 R/mc_influence.R delete mode 100644 R/mc_qic.R delete mode 100644 R/mc_qll.R delete mode 100644 R/mc_rw1.R delete mode 100644 R/mc_rw2.R delete mode 100644 R/mc_unstructured.R diff --git a/R/mc_fast_forward.R b/R/mc_fast_forward.R deleted file mode 100644 index 07869e6..0000000 --- a/R/mc_fast_forward.R +++ /dev/null @@ -1,49 +0,0 @@ -#' Fast forward selection for multivariate covariance generalized linear -#' models. -#' -#' @description Perform fast forward model selection using the score -#' information criterion. This function works only for univariate months. -#' -#' @param object an object representing a model of \code{mcglm} class. -#' @param scope a vector specyfing the covariate to be tested. -#' @param interaction Maximum number of covariates interacting. -#' @param penalty penalty term (default = 2). -#' @param n_max Maximum number of models to be fitted. -#' @return The selected model. -#' @export - -mc_fast_forward <- function(object, scope, interaction = 1, - penalty = 2, n_max = 10) { - if (interaction > 1) { - int_terms <- list() - for (i in 2:interaction) { - int_terms[[c(i-1)]] <- combn(length(scope), i) - } - fun_temp <- function(int_terms) { - output <- c() - for(i in 1:dim(int_terms)[2]) { - output[i] <- paste(scope[int_terms[,i]],collapse = "*") - } - return(output) - } - scope <- do.call(c, lapply(int_terms, fun_temp)) - } - for (i in 1:n_max) { - if(length(scope) == 0) break - sic <- mc_sic(object = object, scope = scope, - data = data, response = 1) - if (all(sic$SIC < 0)) break - cov_new <- as.numeric(rownames(sic[which.max(sic$SIC),])) - cov_enter <- scope[as.numeric(rownames(sic[which.max(sic$SIC),]))] - next_cov <- paste("~. +", cov_enter) - new_formula <- update.formula(object$linear_pred[[1]], next_cov) - temp_models <- mcglm(c(new_formula), - matrix_pred = object$matrix_pred, - link = object$link, variance = object$variance, - covariance = object$covariance, data = data) - object <- temp_models - scope <- scope[-cov_new] - cat(paste("Iteration", i), "\n") - } - return(object) -} diff --git a/R/mc_influence.R b/R/mc_influence.R deleted file mode 100644 index fc5e4c4..0000000 --- a/R/mc_influence.R +++ /dev/null @@ -1,128 +0,0 @@ -#' @title Influence measures for McGLMs -#' -#' @description Compute influence measures for multivariate covariance -#' generalized linear models. Leverage, DFBETA and Cook's distance -#' for unit sample and observations. -#' @param object An object of \code{mcglm} class. -#' @param id a vector which identifies the clusters. -#' The length and order of id should match with the number of -#' observations. -#' @return A list with influence measures for cluster and observations. -#' -#' @author Wagner Hugo Bonat, \email{wbonat@@ufpr.br} -#' @export - -mc_influence <- function(object, id) { - temp_data <- data.frame(object$residuals, id) - names(temp_data) <- c("res", "id") - data_id <- split(temp_data, temp_data$id) - n_id <- length(data_id) - D <- bdiag(lapply(object$mu_list, function(x) x$D)) - n_beta <- dim(D)[2] - R <- bdiag(lapply(data_id, function(x) { - tcrossprod(x[, 1]) - })) - # Leverage for observations - inv_M <- -object$inv_S_beta - M <- solve(inv_M) - uni_id <- as.character(unique(id)) - Hi <- list() - Di <- list() - inv_Ci <- list() - for (i in 1:n_id) { - idTF <- id == uni_id[i] - if(sum(idTF) == 1) { - Di[[i]] <- Matrix(D[idTF,], nrow = sum(idTF), ncol = dim(D)[2]) - } else { - Di[[i]] <- D[idTF,] - } - inv_Ci[[i]] <- object$inv_C[idTF,idTF] - Hi[[i]] <- Di[[i]]%*%inv_M%*%t(Di[[i]])%*%inv_Ci[[i]] - } - H <- bdiag(Hi) - # Leverage for observations - Hobs <- diag(H) - # Leverage for clusters - Hid <- tapply(Hobs, id, mean) - # DFBETAs for clusters - I <- Diagonal(dim(temp_data)[1], 1) - inv_IH <- solve(I - H) - DFBETACi <- list() - DFBETAOij <- list() - DCLSi <- c() - for(i in 1:n_id) { - idTF <- id == uni_id[i] - if(sum(idTF) == 1) { - D_i <- Matrix(D[idTF,], nrow = sum(idTF), ncol = n_beta) - inv_C_i <- Matrix(object$inv_C[idTF,idTF],ncol = 1, nrow = 1) - } else { - D_i <- D[idTF,] - inv_C_i <- object$inv_C[idTF,idTF] - } - inv_IH_i = inv_IH[idTF,idTF] - r_i <- object$residuals[idTF] - DFBETACi[[i]] <- t(inv_M%*%t(D_i)%*%inv_C_i%*%inv_IH_i%*%r_i) - DCLSi[i] <- as.numeric(DFBETACi[[i]]%*%M%*%t(DFBETACi[[i]]))/n_beta - if(dim(inv_C_i)[1] == 1) {DFBETAOij[[i]] <- DFBETACi[[i]] - } else { - DFBETAOij[[i]] <- mc_dfbetaOij(Di = D_i, Ci = object$C[idTF,idTF], - inv_Ci = inv_C_i, ri = r_i, - inv_M = inv_M) - } - } - DFBETACi <- do.call(rbind, DFBETACi) - DFBETAOij <- do.call(rbind, DFBETAOij) - DCOij <- apply(DFBETAOij, MARGIN = 1, - function(x,M,n_beta)as.numeric((t(x)%*%M%*%x)/n_beta), - M = M, n_beta = n_beta) - std.error <- coef(object, type = "beta", std.error = TRUE)$Std.error - DFBETACi = data.frame(as.matrix(DFBETACi))/std.error - DFBETAOij = data.frame(as.matrix(DFBETAOij))/std.error - names(DFBETACi) <- do.call(c, object$beta_names) - names(DFBETAOij) <- do.call(c, object$beta_names) - DFBETACi$Leverage <- as.numeric(Hid) - DFBETACi$Cook <- as.numeric(DCLSi) - DFBETAOij$Leverage <- as.numeric(Hobs) - DFBETAOij$Cook <- as.numeric(DCOij) - DFBETAOij$Id <- rownames(object$data) - DFBETACi$Id <- uni_id - output <- list("Id" = DFBETACi, "Obs" = DFBETAOij) - return(output) -} - -#' @title Influence measures for McGLMs -#' -#' @description Compute influence measures for multivariate covariance -#' generalized linear models. Leverage, DFBETA and Cook's distance -#' for observations. Auxiliar function for \code{mc_influence}. -#' @param Di D matrix for the cluster i. -#' @param Ci C matrix for the cluster i. -#' @param inv_Ci Inverse of C matrix for the cluster i. -#' @param ri Residual vector for the cluster i. -#' @param inv_M Inverse of variance/covariance of regression parameters. -#' @return Matrix with the DFBETA for observation in the cluster i. -#' -#' @author Wagner Hugo Bonat, \email{wbonat@@ufpr.br} -#' @export - -mc_dfbetaOij <- function(Di, Ci, inv_Ci, ri, inv_M) { - nobs <- dim(inv_Ci)[1] - nbeta <- dim(Di)[2] - DFBETAOij <- matrix(NA, ncol = nbeta, nrow = nobs) - for (i in 1:nobs) { - Ci.jj <- Matrix(Ci[-i,i]) - Cij.j <- t(Ci.jj) - inv_Ci.j <- inv_Ci[-i,-i] - Di.j <- Di[-i,] - Dij_temp <- Di[i,] - Cij.j%*%inv_Ci.j%*%Di.j - rij_temp <- as.numeric(ri[i] - Cij.j%*%inv_Ci.j%*%ri[-i]) - Cij_temp <- as.numeric(Ci[i,i] - Cij.j%*%inv_Ci.j%*%t(Cij.j)) - Hij_temp <- as.numeric(Dij_temp%*%inv_M%*%t(Dij_temp)%*%solve(Cij_temp)) - part2 <- Matrix(rij_temp/(Cij_temp*(1-Hij_temp))) - DFBETAOij[i,] <- as.numeric(t(inv_M%*%t(Dij_temp)%*%part2)) - } - return(DFBETAOij) -} - - - diff --git a/R/mc_qic.R b/R/mc_qic.R deleted file mode 100644 index e51bd66..0000000 --- a/R/mc_qic.R +++ /dev/null @@ -1,39 +0,0 @@ -#' @title Compute Quasi Information Criterion (QIC) for McGLMs. -#' @name qic.mcglm -#' -#' @description \code{qic.mcglm} is a function which computes the QIC -#' for McGLMs. -#' -#' @param object An object of \code{mcglm} class. -#' @param object.iid An object of \code{mcglm} class contained the model -#' fitted using independent covariance structure. -#' -#' @return The QIC value. -#' -#' @author Wagner Hugo Bonat, \email{wbonat@@ufpr.br} -#' -#' @export - -qic.mcglm <- function(object, object.iid) { - mu <- fitted(object) - obs <- object$observed - n_resp <- dim(mu)[2] - Q <- matrix(NA, ncol = dim(mu)[2], nrow = dim(mu)[1]) - for (i in 1:n_resp) { - if (object$power_fixed[[i]] == FALSE) { - power <- coef(object, type = "power", response = i)$Estimate - } - if (object$power_fixed[[i]] == TRUE) { - power = object$list_initial$power[[i]] - } - Q[, i] <- mc_qll(y = obs[, i], - mu = mu[, i], - variance = object$variance[[i]], - power = power) - } - Vbeta <- -object$inv_S_beta - Vnull <- solve(-object.iid$inv_S_beta) - t1 <- -2 * sum(Q) - qic <- t1 + 2 * sum(diag(Vnull %*% Vbeta)) - return(list(Q = t1, qic = qic)) -} diff --git a/R/mc_qll.R b/R/mc_qll.R deleted file mode 100644 index e9e4c14..0000000 --- a/R/mc_qll.R +++ /dev/null @@ -1,37 +0,0 @@ -#' Compute quasi-likelihood function. -#' -#' Given a variance function mc_qll function computes the quasi-likelihood values. -#' @param y A vector of observed values. -#' @param mu A vector of fitted values. -#' @param variance Variance function (constant, tweedie, poisson_tweedie, binomial). -#' @param power Power parameter value. -#' @return The quasi-likelihood values. -#' @export - -mc_qll <- function(y, mu, variance, power) { - if (variance == "constant") { - qll <- -((y - mu)^2)/2 # Gaussian case - } - if (variance == "tweedie" & power == 1) { - qll <- y * log(mu) - mu # Poisson case - } - if (variance == "tweedie" & power == 2) { - -y/mu - log(mu) # Gamma case - } - if (variance == "tweedie" & power != 1 & power != 2) { - qll <- (mu^-power) * ((mu * y)/(1 - power) - (mu^2)/(2 - power)) # General Tweedie case - } - if (variance == "poisson_tweedie" & power == 1) { - qll <- (y * log(mu) - mu) + (y * log(mu) - mu) - } - if (variance == "poisson_tweedie" & power == 2) { - qll <- (y * log(mu) - mu) + (-y/mu - log(mu)) - } - if (variance == "poisson_tweedie" & power != 1 & power != 2) { - qll <- (y * log(mu) - mu) + (mu^-power) * ((mu * y)/(1 - power) - (mu^2)/(2 - power)) - } - if (variance == "binomial") { - qll <- y * log(mu/(1 - mu)) + log(1 - mu) # Binomial case - } - return(qll) -} diff --git a/R/mc_rw1.R b/R/mc_rw1.R deleted file mode 100644 index 519ca71..0000000 --- a/R/mc_rw1.R +++ /dev/null @@ -1,29 +0,0 @@ -#' Random walk first order model -#' -#' @description Builds a random walk first order model matrix. -#' -#' @param n_time Number observations time. -#' @param intrinsic Logical indicating if the models is intrinsic (rho = 1) or not. -#' @return A matrix. Note that the function assumes that the data are in the correct order. -#' @export -mc_rw1 <- function(n_time, intrinsic = TRUE) { - R <- Matrix(0, nrow = n_time, ncol = n_time, sparse = TRUE) - ## Border restriction - ncol = n_time - R[1, c(1, 2)] <- c(1, -1) - R[ncol, c(ncol - 1, ncol)] <- c(-1, 1) - ## Body of matrix - n <- ncol - 1 - for (i in 2:n) { - R[i, c(i - 1, i, i + 1)] <- c(-1, 2, -1) - } - if (intrinsic == TRUE) { - output <- list(R) - } - if (intrinsic == FALSE) { - R1 <- Diagonal(n_time, diag(R)) - diag(R) <- 0 - output <- list(Z1 = R1, Z2 = R) - } - return(output) -} diff --git a/R/mc_rw2.R b/R/mc_rw2.R deleted file mode 100644 index 6788c1c..0000000 --- a/R/mc_rw2.R +++ /dev/null @@ -1,31 +0,0 @@ -#' Random walk second order model -#' -#' @description Builds a random walk second order model matrix. -#' -#' @param n_time Number observations time. -#' @param intrinsic Logical indicating if the models is intrinsic (rho = 1) or not. -#' @return A matrix. Note that the function assumes that the data are in the correct order. -#' @export -mc_rw2 <- function(n_time, intrinsic = TRUE) { - R <- Matrix(0, nrow = n_time, ncol = n_time, sparse = TRUE) - ## Border restriction - ncol = n_time - R[1, c(1, 2, 3)] <- c(1, -2, 1) - R[ncol, c(c(ncol - 2):ncol)] <- c(1, -2, 1) - R[2, c(1:4)] <- c(-2, 5, -4, 1) - R[c(ncol - 1), c(c(ncol - 3):c(ncol))] <- c(1, -4, 5, -2) - ## Body of matrix - n <- ncol - 2 - for (i in 3:n) { - R[i, c(i - 2, i - 1, i, i + 1, i + 2)] <- c(1, -4, 6, -4, 1) - } - if (intrinsic == TRUE) { - output <- list(R) - } - if (intrinsic == FALSE) { - R1 <- Diagonal(n_time, diag(R)) - diag(R) <- 0 - output <- list(Z1 = R1, Z2 = R) - } - return(output) -} diff --git a/R/mc_unstructured.R b/R/mc_unstructured.R deleted file mode 100644 index afc67eb..0000000 --- a/R/mc_unstructured.R +++ /dev/null @@ -1,22 +0,0 @@ -#' Unstructured model -#' -#' @description Builds a unstructured model matrix. -#' -#' @param n_time Number of observations per unit sample. -#' @return A matrix. Note that the function assumes that the data are in the correct order. -#' @export - -mc_unstructured <- function(n_time) { - mat.temp <- Matrix(0, ncol = n_time, nrow = n_time, sparse = TRUE) - non.diagonal.terms <- list() - non.diagonal <- t(combn(n_time, 2)) - n.cor.par <- dim(non.diagonal)[1] - ## Covariance elementary matrices - for (i in 1:n.cor.par) { - non.diagonal.terms[i][[1]] <- mat.temp - non.diagonal.terms[i][[1]][non.diagonal[i, 1], non.diagonal[i, 2]] <- non.diagonal.terms[i][[1]][non.diagonal[i, - 2], non.diagonal[i, 1]] <- 1 - } - ## Output - return(non.diagonal.terms) -} -- GitLab