Downregulated transcription in chromosomal domains of midbrain dopamine neurons linked to schizophrenia.
The 3 matches
- [1] § Methods › Data normalization, selection of covariates, and statistical analysis of differences in gene expression of cases and controls ↔ R/evalCriterion.R, lines 4–152 · score 0.65 · mvForwardStepwise, model selection, BIC, Covariates, gene
- [2] § Methods › Data normalization, selection of covariates, and statistical analysis of differences in gene expression of cases and controls ↔ vignette/seqc.Rmd, lines 115–136 · score 0.59 · mvForwardStepwise, model selection, BIC, gene
- [3] § Methods › remaCorr analysis of differences in Tx expression ↔ R/evalCriterion.R, lines 161–244 · score 0.51 · variancePartition, voom, limma, transformation, DREAM, linear
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
R · 628 lines · 23 KB · no license · 2 matches
- # Gabriel Hoffman
- # April 12, 2020
- #' Multivariate forward stepwise regression
- #'
- #' Multivariate forward stepwise regression evluated by multivariate BIC
- #'
- #' @param exprObj matrix of expression data (g genes x n samples), or ExpressionSet, or EList returned by voom() from the limma package
- #' @param baseFormula specifies baseline variables for the linear (mixed) model. Must only specify covariates, since the rows of exprObj are automatically used as a response. e.g.: \code{~ a + b + (1|c)} Formulas with only fixed effects also work, and \code{lmFit()} followed by \code{contrasts.fit()} are run.
- #' @param data data.frame with columns corresponding to formula
- #' @param variables array of variable names to be considered in the regression. If variable should be considered as random effect, use '(1|A)'.
- #' @param criterion multivariate criterion ('AIC', 'BIC') or summing score assuming independence of reponses ('sum AIC', 'sum BIC')
- #' @param shrink.method Shrink covariance estimates to be positive definite. Using "var_equal" assumes all variance on the diagonal are equal. This method is the fastest because it is linear time. Using "var_unequal" allows each response to have its own variance term, however this method is quadratic time. Using "none" does not apply shrinkge, but is only valid when there are very few responses
- #' @param nparamsMethod "edf": effective degrees of freedom. "countLevels" count number of levels in each random effect. "lme4" number of variance compinents, as used by lme4. See description in \code{\link{nparam}}
- #' @param deltaCutoff stop interating of the model improvement is less than deltaCutoff. default is 5
- #' @param pca use PCA to transform variables
- #' @param verbose Default TRUE. Print messages
- #' @param ... additional arguements passed to logDet
- #'
- #' @return list with formula of final model, and trace of iterations during model selection
- #' @examples
- #'
- #' Y = with(iris, rbind(Sepal.Width, Sepal.Length))
- #'
- #' # fit forward stepwise regression starting with model: ~1.
- #' bestModel = mvForwardStepwise( Y, ~ 1, data=iris, variables=colnames(iris)[3:5])
- #'
- #' bestModel
- #'
- #' @import variancePartition
- #' @importFrom stats as.formula
- #' @importFrom dplyr as_tibble
- #' @export
- mvForwardStepwise = function( exprObj, baseFormula, data, variables, criterion = c( "BIC", "sum BIC", "AIC", "AICC", "CAIC", "sum AIC"), shrink.method = c( "EB", "none", "var_equal", "var_unequal"), nparamsMethod = c("edf", "countLevels", "lme4"), deltaCutoff = 5, pca = TRUE, verbose=TRUE,... ){
- criterion = match.arg(criterion)
- shrink.method = match.arg(shrink.method)
- nparamsMethod = match.arg(nparamsMethod)
- baseFormula = as.formula( baseFormula )
- if( ! is.data.frame(data) ){
- data = as.data.frame(data, stringsAsFactors=FALSE)
- }
- data = droplevels(data)
- # Apply PCA only once, instead of in each call to mvIC_fit
- if( pca ){
- if( is(exprObj, "matrix") ){
- exprObj = t(pcTransform(t(exprObj)))
- }else{
- exprObj = t(pcTransform(t(exprObj$E)))
- }
- }
- # score base model
- suppressWarnings({
- baseScore = mvIC_fit( exprObj, baseFormula, data, criterion=criterion, shrink.method=shrink.method, nparamsMethod=nparamsMethod, verbose=FALSE, pca=FALSE,...)
- })
- resTrace = data.frame( iter = 0,
- variable = as.character(baseFormula)[-1],
- delta = NA,
- score = as.numeric(baseScore),
- isBest = "yes",
- isAdded = "yes",
- stringsAsFactors=FALSE)
- resTrace = cbind(resTrace, baseScore@params)
- iteration = 1
- # run until break
- while(1){
- if( verbose ) message(paste0("Base model: ", paste0(baseFormula, collapse=' ')))
- # evaluate score of each potential model
- score = lapply( variables, function(feature){
- if( verbose ) message(paste("\r\tevaluating: +", feature, ' '), appendLF=FALSE)
- # formula of model to try
- form = as.formula(paste(paste0(baseFormula, collapse=' '), "+", feature))
- suppressWarnings({
- # evaluate multivariate score
- mvIC_fit( exprObj, form, data, criterion=criterion, shrink.method=shrink.method, nparamsMethod=nparamsMethod, verbose=FALSE, pca=FALSE, ...)
- })
- })
- # get index of minumum score
- i = which.min(unlist(score))
- # get difference between best and second best score
- delta = as.numeric(score[[i]] - baseScore)
- if( verbose ) message("\nBest model delta: ", format(delta, nsmall=1, digits=1))
- isBest = rep("", length(score))
- isAdded = rep("", length(score))
- isBest[i] = "yes"
- if( delta < -deltaCutoff ){
- isAdded[i] = "yes"
- }
- resNew = data.frame(iter = iteration,
- variable = variables,
- delta = as.numeric(unlist(score) - baseScore),
- score = unlist(score),
- isBest = isBest,
- isAdded = isAdded,
- stringsAsFactors=FALSE)
- # get summary stats from model fits
- params = lapply(score, function(x) x@params)
- params = do.call(rbind, params)
- # combine results from this iteration
- resNew = cbind(resNew, params)
- # combine with results from previous interations
- resTrace = rbind(resTrace, resNew)
- iteration = iteration + 1
- # evaluate of best model is better than existing model
- if( delta < -deltaCutoff ){
- if( verbose ) message("Add variable to model: ", variables[i], '\n')
- # set new model, baseScore and possible variable list
- baseFormula = as.formula(paste(paste0(baseFormula, collapse=' '), "+", variables[i]))
- baseScore = score[[i]]
- variables = variables[-i]
- # if there are no additional variables to try
- if( length(variables) == 0){
- break
- }
- }else{
- if( verbose ){
- message(paste0("\nFinal model:\n ", paste0(baseFormula, collapse=' ')))
- }
- break
- }
- }
- # remove some columns from resTrace that are constant
- idx = colnames(resTrace) %in% c("n", 'p', 'criterion', 'shrink.method')
- # return as mvIC_result object
- new("mvIC_result", list(formula = baseFormula,
- settings= resTrace[1,idx],
- trace = as_tibble(resTrace[,!idx]) ))
- }
- #' Evaluate multivariate BIC
- #'
- #' Evaluate multivariate BIC on matrix of response variables. Smaller is better.
- #'
- #' @param exprObj matrix of expression data (g genes x n samples), or ExpressionSet, or EList returned by voom() from the limma package
- #' @param formula specifies variables for the linear (mixed) model. Must only specify covariates, since the rows of exprObj are automatically used as a response. e.g.: \code{~ a + b + (1|c)} Formulas with only fixed effects also work, and \code{lmFit()} followed by \code{contrasts.fit()} are run.
- #' @param data data.frame with columns corresponding to formula
- #' @param criterion multivariate criterion ('AIC', 'BIC') or summing score assuming independence of reponses ('sum AIC', 'sum BIC')
- #' @param shrink.method Shrink covariance estimates to be positive definite. Using "var_equal" assumes all variance on the diagonal are equal. This method is the fastest because it is linear time. Using "var_unequal" allows each response to have its own variance term, however this method is quadratic time. Using "none" does not apply shrinkge, but is only valid when there are very few responses
- #' @param nparamsMethod "edf": effective degrees of freedom. "countLevels" count number of levels in each random effect. "lme4" number of variance compinents, as used by lme4. See description in \code{\link{nparam}}
- #' @param pca use PCA to transform variables
- #' @param verbose Default TRUE. Print messages
- #' @param ... additional arguements passed to logDet
- #'
- #' @description
- #' Evaluate multivariate BIC while considering correlation between response variables. For n samples, p responses and m parameters for each model, evaluate the multivariate BIC as \deqn{n * logDet(\Sigma) + log(n) * (p*m + 0.5*p*(p+1))}
- #' where \eqn{\Sigma} is the residual covariance matrix. This formula extends the standard univariate BIC to the multivariate case.
- #' For one response the standard penalty is \eqn{log(n)*m}, this just adds a \eqn{log(n)} to that value, but only the differences between two models is important. Estimating the \eqn{p x p} covariance matrix requires \eqn{0.5*p*(p+1)} parameters.
- #' When \eqn{p > m} the residual covariance matrix Sigma is not full rank. In this case the psudo-determinant is used instead.
- #'
- #' @references{
- #' \insertRef{pauler1998schwarz}{mvIC}
- #'
- #' \insertRef{bedrick1994model}{mvIC}
- #'
- #' \insertRef{wu2013weighted}{mvIC}
- #' }
- #'
- #' @return multivariate BIC value
- #' @examples
- #'
- #' # create matrix of responses
- #' Y = with(iris, rbind(Sepal.Width, Sepal.Length))
- #'
- #' # Evaluate model 1
- #' mvIC_fit( Y, ~ Species, data=iris)
- #'
- #' # Evaluate model 2
- #' # smaller mvIC means better model
- #' mvIC_fit( Y, ~ Petal.Width + Petal.Length + Species, data=iris)
- #'
- #' @import variancePartition Rdpack
- #'
- #' @export
- mvIC_fit = function( exprObj, formula, data, criterion = c( "BIC", "sum BIC", "AIC", "AICC", "CAIC", "sum AIC"), shrink.method = c( "EB", "none", "var_equal", "var_unequal"), nparamsMethod = c("edf", "countLevels", "lme4"), pca = TRUE, verbose=FALSE,... ){
- criterion = match.arg(criterion)
- shrink.method = match.arg(shrink.method)
- nparamsMethod = match.arg(nparamsMethod)
- formula = as.formula(formula)
- if( ! is.data.frame(data) ){
- data = as.data.frame(data, stringsAsFactors=FALSE)
- }
- # if pca
- if( pca ){
- if( is(exprObj, "matrix") ){
- exprObj = t(pcTransform(t(exprObj)))
- }else{
- exprObj = t(pcTransform(t(exprObj$E)))
- }
- }
- # fit model and compute residuals
- suppressWarnings({
- modelFit = dream( exprObj, formula, data, REML=FALSE, computeResiduals=TRUE, quiet=!verbose)
- })
- # extract residuals
- residMatrix = residuals( modelFit )
- # effect fixed
- if( modelFit$method == "ls"){
- m <- ncol(coef(modelFit)) #+ 1
- }else{
- # effective number of parameters is returned by dream
- m = mean(attr(modelFit, "edf"))
- attr(m,"nparamsMethod") = "edf"
- }
- mvIC_from_residuals( residMatrix, m, criterion=criterion, shrink.method=shrink.method,... )
- }
- #' residuals for MArrayLM
- #'
- #' residuals for MArrayLM
- #'
- #' @param object MArrayLM object from dream
- #' @param ... other arguments, currently ignored
- #'
- #' @return results of residuals
- #' @importFrom limma residuals.MArrayLM
- #' @rdname residuals-method
- #' @aliases residuals,MArrayLM-method
- setMethod("residuals", "MArrayLM",
- function( object, ...){
- if( is.null(object$residuals) ){
- # use residuals computed by limma
- res = residuals.MArrayLM( object, ...)
- }else{
- # use precomputed residuals
- res = object$residuals
- }
- res
- })
- #Matrix of residual from list of model fits
- #
- # Matrix of residual from list of model fits
- #
- # @param fitList list of model fits from \code{lm()} or \code{lmer()}
- #
- getResids = function(fitList){
- if(is(fitList, "list")){
- residMatrix = lapply(fitList, residuals)
- residMatrix = do.call(rbind, residMatrix)
- }else if(is(fitList, "mlm")){
- residMatrix = t(residuals( fitList))
- }else{
- residMatrix = t(residuals(fitList))
- }
- residMatrix
- }
- #' Number of parameters in model
- #'
- #' Number of parameters in model from \code{lm()} or \code{lmer()}
- #'
- #' @param object model fit by \code{lm()} or \code{lmer()}
- #' @param nparamsMethod "edf": effective degrees of freedom. "countLevels" count number of levels in each random effect. "lme4" number of variance compinents, as used by lme4. See description in \code{\link{nparam}}
- #'
- #' @description
- #' In the case of \code{lm()}, the result is the number of coefficients For a linear mixed model fit with \code{lmer()} there are 3 options. "edf": effective degrees of freedom as computed by sum of diagonal values of the hat matrix return by \code{lmer()} . "countLevels", returns the number of fixed effects + number of levels in random effects + 1 for residual variance term. This treats each level of a random effect as a parameter. "lme4", returns number of fixed effects + number of variance components. Here a random effect with 10 levels is only counted as 1 parameter. This tends to underpenalize.
- # , + 1 for the variance term.
- #' @return number of parameters
- #' @importFrom stats coef
- #' @importFrom methods is
- #' @importFrom stats hatvalues
- nparam = function( object, nparamsMethod = c("edf", "countLevels", "lme4")){
- nparamsMethod = match.arg(nparamsMethod)
- if( is(object, "list") & nparamsMethod == "edf" ){
- if( all(sapply(object, function(fit) is(fit, "merMod"))) ){
- # mean of effective degrees of freedom across all responses
- m = mean(sapply( object, function(fit) sum(hatvalues(fit))))
- attr(m, "nparamsMethod") = "edf"
- return(m)
- }
- }
- # if object is not any of these
- if( !is(object, "lm") & !is(object, "mlm") & !is(object, 'merMod') ){
- # see if element of list is valid model fit
- object = object[[1]]
- }
- if( is(object, "mlm") ){
- # must be evaluated first because if object is 'mlm', it is also 'lm'
- # need 'mlm' to take presidence
- m = nrow(coef(object)) #+ 1
- attr(m, "nparamsMethod") = "lm"
- }else if( is(object, "lm") ){
- m = length(coef(object)) #+ 1
- attr(m, "nparamsMethod") = "lm"
- }else if( is(object, "merMod") ){
- m = switch( nparamsMethod,
- # effective degrees of freedom
- # Add term for residual variance
- "edf" = sum(hatvalues(object)),
- # fixed + number of random levels
- "countLevels" = length(object@beta) + object@devcomp[["dims"]][['q']] + object@devcomp[["dims"]][["useSc"]],
- # lme4:::npar.merMod
- # counts each random effect as a single parameter
- "lme4" = length(object@beta) + length(object@theta) + object@devcomp[["dims"]][["useSc"]],
- "already estimated" = m
- )
- attr(m, "nparamsMethod") = nparamsMethod
- }else{
- stop("object is not a valid model fit from lm() or lmer()")
- }
- m
- }
- #' Evaluate multivariate BIC
- #'
- #' Evaluate multivariate BIC from a list of regression fits
- #'
- #' @param fitList list of model fits with \code{lm()} or \code{lmer()}. All models must have same data, response and formula.
- #' @param criterion multivariate criterion ('AIC', 'BIC') or summing score assuming independence of reponses ('sum AIC', 'sum BIC')
- #' @param shrink.method Shrink covariance estimates to be positive definite. Using "var_equal" assumes all variance on the diagonal are equal. This method is the fastest because it is linear time. Using "var_unequal" allows each response to have its own variance term, however this method is quadratic time. Using "none" does not apply shrinkge, but is only valid when there are very few responses
- #' @param nparamsMethod "edf": effective degrees of freedom. "countLevels" count number of levels in each random effect. "lme4" number of variance compinents, as used by lme4. See description in \code{\link{nparam}}
- #' @param ... additional arguements passed to logDet
- #'
- #' @description
- #' Evaluate multivariate BIC while considering correlation between response variables. For n samples, p responses and m parameters for each model, evaluate the multivariate BIC as \deqn{n * logDet(\Sigma) + log(n) * (p*m + 0.5*p*(p+1))}
- #' where \eqn{\Sigma} is the residual covariance matrix. This formula extends the standard univariate BIC to the multivariate case.
- #' For one response the standard penalty is \eqn{log(n)*m}, this just adds a \eqn{log(n)} to that value, but only the differences between two models is important. Estimating the \eqn{p x p} covariance matrix requires \eqn{0.5*p*(p+1)} parameters.
- #' When \eqn{p > m} the residual covariance matrix Sigma is not full rank. In this case the psudo-determinant is used instead.
- #'
- #' See References
- #'
- #' Pauler, DK. The Schwarz criterion and related methods for normal linear models. Biometrika (1998), 85, 1, pp. 13-27
- #'
- #' Edward J. Bedrick and Chih-Ling Tsai. Model Selection for Multivariate Regression in Small Samples. Biometrics, 50:1 1994 226-231
- #'
- #' TJ Wu, P Chen, Y Yan. The weighted average information criterion for multivariate regression model selection. Signal Processing 93.1 (2013): 49-55.
- #'
- #' @return multivariate BIC value
- #' @examples
- #' # Predict Sepal width and Length given Species
- #' # Evaluate model fit
- #' fit1 = lm( cbind(Sepal.Width, Sepal.Length) ~ Species, data=iris)
- #' mvIC( fit1 )
- #'
- #' # add Petal width and length
- #' # smaller mvIC means better model
- #' fit2 = lm( cbind(Sepal.Width, Sepal.Length) ~ Petal.Width + Petal.Length + Species, data=iris)
- #' mvIC( fit2 )
- #'
- #' @importFrom methods is
- #' @export
- mvIC = function( fitList, criterion = c( "BIC", "sum BIC", "AIC", "AICC", "CAIC", "sum AIC"), shrink.method = c( "EB", "none", "var_equal", "var_unequal"), nparamsMethod = c("edf", "countLevels", "lme4"), ...){
- criterion = match.arg(criterion)
- shrink.method = match.arg(shrink.method)
- nparamsMethod = match.arg(nparamsMethod)
- # get residuals for 'mlm', 'lm', or list of 'lm' or 'lmer'
- residMatrix = getResids( fitList )
- # get number of parameters for multiple forms of fitList
- m = nparam( fitList, nparamsMethod=nparamsMethod )
- mvIC_from_residuals( residMatrix, m, criterion=criterion, shrink.method=shrink.method,...)
- }
- #' Evaluate multivariate BIC from matrix of residuals
- #'
- #' Evaluate multivariate BIC from matrix of residuals
- #'
- #' @param residMatrix matrix of residuals where rows are features
- #' @param m number of parameters for each model
- #' @param criterion multivariate criterion ('AIC', 'BIC') or summing score assuming independence of reponses ('sum AIC', 'sum BIC')
- #' @param shrink.method Shrink covariance estimates to be positive definite. Using "var_equal" assumes all variance on the diagonal are equal. This method is the fastest because it is linear time. Using "var_unequal" allows each response to have its own variance term, however this method is quadratic time. Using "none" does not apply shrinkge, but is only valid when there are very few responses
- #' @param ... other arguments passed to logDet
- #'
- #' @importFrom methods new
- mvIC_from_residuals = function( residMatrix, m, criterion = c( "BIC", "sum BIC", "AIC", "AICC", "CAIC", "sum AIC"), shrink.method = c( "EB", "none", "var_equal", "var_unequal"), ... ){
- criterion = match.arg(criterion)
- shrink.method = match.arg(shrink.method)
- n = ncol(residMatrix) # number of samples
- p = nrow(residMatrix) # number of response variables
- if( criterion %in% c("AIC", "BIC", "AICC", "CAIC") ){
- if( criterion %in% c("AICC", "CAIC") & n < p){
- stop(paste("Criterion", criterion, "cannot be evaluated when n < p"))
- }
- # compute log determinant explicitly
- # slower and not defined for low rank matrices
- # dataTerm = n * determinant(crossprod(residMatrix), log=TRUE)$modulus[1]
- if( shrink.method == "EB"){
- # est_param = shrinkcovmat.equal_lambda( residMatrix )
- # responses are *rows*
- res = eclairs(t(residMatrix))
- lambda = res$lambda
- # b = beam::beam(t(residMatrix), verbose=FALSE)
- # lambda = b@alphaOpt
- # res = list(logLik = b@valOpt)
- # dataTerm = -2*res$logLik
- dataTerm = -2*res$logML
- gdf_cov = p + (1-lambda)*p*(p-1)/2
- }else{
- # Evaluate logDet based on shrink.method
- logDet = rlogDet( residMatrix, shrink.method,... )
- dataTerm = n * logDet
- # get effective number of parameter used to estimate covariance by shrinkage
- gdf_cov = attr(logDet, "param")$gdf
- lambda = attr(logDet, "param")$lambda
- }
- # see Yanagihara, et al. 2015
- # doi:10.1214/15-EJS1022
- # penalty = switch( criterion,
- # "AIC" = 2 * (p*(m-1) + gdf_cov),
- # "BIC" = log(n) * (p*(m-1) + gdf_cov),
- # "AICC" = 2 * n*(p*(m-1) + gdf_cov) / (n-(m-1) - p - 1),
- # "CAIC" = (1+log(n)) * (p*(m-1) + gdf_cov))
- penalty = switch( criterion,
- "AIC" = 2 * (p*m + gdf_cov),
- "BIC" = log(n) * (p*m + gdf_cov),
- "AICC" = 2 * n*(p*m + gdf_cov) / (n-m - p - 1),
- "CAIC" = (1+log(n)) * (p*m + gdf_cov))
- # retrun data term plus penalty
- res = dataTerm + penalty
- attr(res, 'params') = data.frame( n = n,
- p = p,
- m = as.numeric(m),
- dataTerm = dataTerm,
- penalty = penalty,
- lambda = lambda,
- df_cov = gdf_cov,
- criterion = criterion,
- shrink.method = shrink.method,
- stringsAsFactors=FALSE)
- if( ! is.null( attr(m, 'nparamsMethod') )){
- attr(res, 'nparamsMethod') = attr(m, 'nparamsMethod')
- }else{
- attr(res, 'nparamsMethod') = "lm"
- }
- }else{
- # Naive metric summing BIC from all models independently
- rss = apply(residMatrix, 1, function(x) sum(x^2))
- dataTerm = n*sum(log(rss/n))
- penalty = switch(criterion,
- "sum AIC" = 2 * m*p,
- "sum BIC" = log(n) * m*p)
- # retrun data term plus penalty
- res = dataTerm + penalty
- attr(res, 'params') = data.frame( n = n,
- p = p,
- m = as.numeric(m),
- dataTerm = dataTerm,
- penalty = penalty,
- lambda = NA,
- df_cov = NA,
- criterion = criterion,
- shrink.method = "none",
- stringsAsFactors=FALSE)
- attr(res, 'nparamsMethod') = "naive"
- }
- new("mvIC", as.numeric(res),
- nparamsMethod = attr(res, 'nparamsMethod'),
- params = attr(res, 'params'))
- }
- #' Class mvIC
- #'
- #' Class stores mvIC score, method and parameter values
- #'
- #' @name mvIC-class
- #' @rdname mvIC-class
- #' @exportClass mvIC
- setClass("mvIC", representation(nparamsMethod = "character", params="data.frame"), contains="numeric")
- # Print mvIC object
- #
- # Print mvIC object
- #
- # @param x mvIC object
- # @export
- setMethod("print", "mvIC", function( x ){
- cat("\t\tMultivariate IC score\n\n")
- cat(paste(" Samples:\t", x@params$n, "\n"))
- cat(paste(" Responses:\t", x@params$p, "\n"))
- cat(paste(" Coef param:\t", round(x@params$m, digits=1), "\n"))
- cat(paste(" Cov param:\t", round(x@params$df_cov, digits=1), "\n"))
- cat(paste(" Regression:\t", x@nparamsMethod), "\n")
- cat(" Shrink method:", x@params$shrink.method, "\n")
- cat(paste(" lambda:\t", format(x@params$lambda, digits=3), "\n"))
- cat(" Criterion:\t", x@params$criterion, "\n")
- cat(" Score:\t", as.numeric(x), "\n\n")
- })
- # Show mvIC object
- #
- # Show mvIC object
- #
- # @param object mvIC object
- # @export
- setMethod("show", "mvIC", function( object ){
- print( object )
- })
- #' Class mvIC_result
- #'
- #' Class stores result of \code{mvForwardStepwise}
- #'
- #' @name mvIC_result-class
- #' @rdname mvIC_result-class
- #' @exportClass mvIC_result
- # setClass("mvIC_result", representation(formula = "formula", settings="data.frame", trace="data.frame"))
- setClass("mvIC_result", contains="list")
- # Print mvIC_result object
- #
- # Print mvIC_result object
- #
- # @param x mvIC_result object
- # @export
- setMethod("print", "mvIC_result", function( x ){
- cat("\t\tMultivariate IC forward stepwise regression\n\n")
- cat(" Samples:\t", x$settings$n, '\n')
- cat(" Responses:\t", x$settings$p, '\n')
- cat(" Shrink method:", x$settings$shrink.method, '\n')
- cat(" Criterion:\t", x$settings$criterion, '\n')
- cat(" Iterations:\t", max(x$trace$iter), "\n\n")
- cat(' Best model:', paste(as.character(x$formula), collapse=" "), '\n\n')
- })
- # Show mvIC_result object
- #
- # Show mvIC_result object
- #
- # @param object mvIC_result object
- # @export
- setMethod("show", "mvIC_result", function( object ){
- print( object )
- })
- #' @importFrom lme4 findbars
- .isMixedModelFormula = function(formula){
- !is.null(findbars(as.formula(formula)))
- }
evalCriterion.R at commit 15f0b63, no license · at the source
Overview
- Department of Psychiatry, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Friedman Brain Institute, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Center for Disease Neurogenomics, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Department of Genetics and Genomic Sciences, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Human Brain Collection Core, National Institute of Mental Health–Intramural Research Program,Bethesda, MD USA
- Mount Sinai Center for Transformative Disease Modeling, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Icahn Genomics Institute, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Department of Pharmacological Sciences, Icahn School of Medicine at Mount Sinai,New York, NY USA
- Mental Illness Research Education and Clinical Center (MIRECC), James J. Peters VA Medical Center,Bronx, NY USA
- Center for Precision Medicine and Translational Therapeutics, James J. Peters VA Medical Center,Bronx, NY USA
Abstract
The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.
Repositories
Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.
codeocean:2247653
Availability: 1 check, the latest on 29 September 2026: cannot be verified
- 29 September 2026: cannot be verified
GabrielHoffman/mvIC
15f0b63089645c840624e71da289aafb172bb2da, 30 August 2022Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
16 files
- R/
bestSubset.R , R, 51 lines - R/
eb_lambda.R , R, 220 lines - R/
eclairs.R , R, 211 lines - R/
evalCriterion.R , R, 628 lines, 2 matches - R/
pcTransform.R , R, 36 lines - R/
regularize_eigen_values. , R, 265 linesR - docs/
bootstrap-toc.js , JavaScript, 159 lines - docs/
docsearch.js , JavaScript, 85 lines - docs/
pkgdown.js , JavaScript, 108 lines - inst/
unitTests/ , R, 209 linestest_mvBIC.R - tests/
runTests.R , R, 2 lines - vignette/
mvBIC.Rmd , R, 214 lines - vignette/
seqc.Rmd , R, 621 lines, 1 match - vignette/
sim_compare_estimates.Rm , R, 172 linesd - vignette/
sims.Rmd , R, 1,266 lines - README.md, Text, 79 lines
cran.r-project.org/package=remacor
Availability: 1 check, the latest on 29 September 2026: the link answers (HTTP 200)
- 29 September 2026: the link answers (HTTP 200)
Code availability statement
The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- it points to the authors' code: codeocean:2247653
Read it in the paper: doi.org/10.1038/s41467-026-71281-7.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 15 scripts, each with its path and the digest of its content;
- 3 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data availability statement
The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- no repository, dataset or request procedure was recognized in it
Read it in the paper: doi.org/10.1038/s41467-026-71281-7.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 29 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 15 authors, 3 keywords, 11 MeSH terms, 1 funder, 63 references.
Cite
This paper
Singh, S., Iskhakova, M., Lambert, T. Y., Valada, A., Shokrian, N., Evans, V., Bendl, J., Auluck, P. K., Marenco, S., Wang, M., Zhang, B., Hoffman, G. E., Girdhar, K., Roussos, P., & Akbarian, S. (2026). Downregulated transcription in chromosomal domains of midbrain dopamine neurons linked to schizophrenia. Nature communications, 17(1), 4922. https://
BibTeX
@article{singh2026downre
author = {Singh, Swadha and Iskhakova, Marina and Lambert, Tova Y. and Valada, Aditi and Shokrian, Neda and Evans, Viviana and Bendl, Jaroslav and Auluck, Pavan K. and Marenco, Stefano and Wang, Minghui and Zhang, Bin and Hoffman, Gabriel E. and Girdhar, Kiran and Roussos, Panos and Akbarian, Schahram},
title = {{Downregulated transcription in chromosomal domains of midbrain dopamine neurons linked to schizophrenia}},
journal = {Nature communications},
year = {2026},
month = apr,
volume = {17},
number = {1},
pages = {4922},
publisher = {Nature Publishing Group},
issn = {2041-1723},
doi = {10.1038/
url = {https://
pmid = {41942462},
pmcid = {PMC13234368}
}
RIS
TY - JOUR
AU - Singh, Swadha
AU - Iskhakova, Marina
AU - Lambert, Tova Y.
AU - Valada, Aditi
AU - Shokrian, Neda
AU - Evans, Viviana
AU - Bendl, Jaroslav
AU - Auluck, Pavan K.
AU - Marenco, Stefano
AU - Wang, Minghui
AU - Zhang, Bin
AU - Hoffman, Gabriel E.
AU - Girdhar, Kiran
AU - Roussos, Panos
AU - Akbarian, Schahram
TI - Downregulated transcription in chromosomal domains of midbrain dopamine neurons linked to schizophrenia
T2 - Nature communications
J2 - Nat Commun
PY - 2026
DA - 2026/
VL - 17
IS - 1
SP - 4922
SN - 2041-1723
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Downregulated transcription in chromosomal domains of midbrain dopamine neurons linked to schizophrenia",
"container-title": "Nature communications",
"author": [
{
"family": "Singh",
"given": "Swadha"
},
{
"family": "Iskhakova",
"given": "Marina"
},
{
"family": "Lambert",
"given": "Tova Y."
},
{
"family": "Valada",
"given": "Aditi"
},
{
"family": "Shokrian",
"given": "Neda"
},
{
"family": "Evans",
"given": "Viviana"
},
{
"family": "Bendl",
"given": "Jaroslav"
},
{
"family": "Auluck",
"given": "Pavan K."
},
{
"family": "Marenco",
"given": "Stefano"
},
{
"family": "Wang",
"given": "Minghui"
},
{
"family": "Zhang",
"given": "Bin"
},
{
"family": "Hoffman",
"given": "Gabriel E."
},
{
"family": "Girdhar",
"given": "Kiran"
},
{
"family": "Roussos",
"given": "Panos"
},
{
"family": "Akbarian",
"given": "Schahram"
}
],
"container-title-short":
"volume": "17",
"issue": "1",
"page": "4922",
"DOI": "10.1038/
"PMID": "41942462",
"PMCID": "PMC13234368",
"ISSN": "2041-1723",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
6
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41588-026-02646-3 [code]
- Co-expression-based models improve eQTL predictions for transcriptome-wide association studies and highlight new schizophrenia-associated
genes. Journal: Nature geneticsIn common: limma, reshape2, data.table, 1 other tool, schizophrenia / psychosis, cellular / molecular, 8 references - [2] doi:10.1038/s41467-026-75722-1 [code]
- Single-nucleus analysis of the adult human olfactory epithelium uncovers shared neurogenesis programs with the brain.Journal: Nature communicationsIn common: reshape2, ggplot2, tidyverse, 2 references, 2 authors
- [3] doi:10.1093/nar/gkag788 [code]
- Neuronal activity-driven 3D chromatin dynamics in cortical pyramidal neurons depend on SATB2.Journal: Nucleic acids researchIn common: edgeR, limma, reshape2, 3 other tools, cellular / molecular, 4 references
- [4] doi:10.1101/gr.281113.125 [code]
- Single-nucleus multiomic profiling of the aging mouse substantia nigra reveals conserved gene alterations linked to Parkinson's disease.Journal: Genome researchIn common: edgeR, limma, reshape2, 3 other tools, cellular / molecular, 3 references
- [5] doi:10.1038/s41467-026-71542-5 [code]
- Astrocyte fatty acid metabolism as a driver of risk for major depressive disorder.Journal: Nature communicationsIn common: edgeR, limma, lme4, 4 other tools, cellular / molecular, 2 references
- [6] doi:10.1111/adb.70179 [code]
- Transcriptional Response to Chronic Long-Access Fentanyl Self-Administration in Rat Habenula and Amygdala.Journal: Addiction biologyIn common: edgeR, limma, lme4, 4 other tools, cellular / molecular, 2 references
- [7] doi:10.1038/s41467-026-74753-y [code]
- A human-specific microRNA controls the timing of excitatory synaptogenesis.Journal: Nature communicationsIn common: edgeR, limma, lme4, 4 other tools, cellular / molecular, 2 references
- [8] doi:10.1038/s41467-026-76675-1 [code]
- Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.Journal: Nature communicationsIn common: edgeR, limma, reshape2, 3 other tools, 3 references
- [9] doi:10.1093/bioinformatics/btag592 [code]
- Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.Journal: Bioinformatics (Oxford, England)In common: edgeR, limma, lme4, 4 other tools, 2 references
- [10] doi:10.1038/s41467-026-74541-8 [code]
- SECmeres outperform extracellular vesicles as potential blood RNA biomarkers for Alzheimer's disease.Journal: Nature communicationsIn common: 1 reference, 2 authors
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 15 scripts, and 3 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:3714121aa53db428…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
