# This file is a generated template, your changes will not be overwritten
#' Correlation Analysis
#'
#' @importFrom R6 R6Class
#' @import jmvcore
#' @import qgraph
#' @import psych
#' @importFrom psych partial.r
#' @importFrom qgraph EBICglasso
#' @importFrom qgraph centralityPlot
#' @importFrom qgraph cor_auto
#' @importFrom corrplot corrplot
#' @export
partialClass <- if (requireNamespace('jmvcore'))
R6::R6Class(
"partialClass",
inherit = partialBase,
private = list(
#==================================================================================
.init = function(){
if(is.null(self$dat) | is.null(self$options$vars)){
self$results$instructions$setVisible(visible = TRUE)
}
self$results$instructions$setContent(
"<html>
<head>
</head>
<body>
<div class='instructions'>
<p>____________________________________________________________________________________</p>
<p>1. When the <b>Controlling for</b> box is null, the result table shows Pearson correlation.</p>
<p>2. If you move the variables into <b>Controlling for</b> box, the result table shows Partial correlation.</p>
<p>3. When One variable is dichotomous, the other is continuous, the result table is equivalent to a point-biserial correlation.</P>
<p>4. Feature requests and bug reports can be made on my <a href='https://github.com/hyunsooseol/seolmatrix/issues' target = '_blank'>GitHub</a>.</p>
<p>____________________________________________________________________________________</p>
</div>
</body>
</html>")
if(isTRUE(self$options$plot)){
width <- self$options$width
height <- self$options$height
self$results$plot$setSize(width, height)
}
if(isTRUE(self$options$plot1)){
width <- self$options$width2
height <- self$options$height2
self$results$plot1$setSize(width, height)
}
if(isTRUE(self$options$plot2)){
width <- self$options$width1
height <- self$options$height1
self$results$plot2$setSize(width, height)
}
if(isTRUE(self$options$plot3)){
width <- self$options$width3
height <- self$options$height3
self$results$plot3$setSize(width, height)
}
# get variables--------------------------------------
matrix <- self$results$get('matrix')
var <- self$options$get('vars')
varCtl <- self$options$get('ctrlvars')
# whether the procedure is controlling for variables or not-----------
matrix$setTitle(ifelse(
length(varCtl) > 0,'Partial Correlation Matrix','Correlation Matrix'
))
# Add Columns----------------------------------
for (i in seq_along(var)) {
matrix$addColumn(
name = paste0(var[[i]], '[r]'),
title = var[[i]],
type = 'number',
format = 'zto'
)
matrix$addColumn(
name = paste0(var[[i]], '[rp]'),
title = var[[i]],
type = 'number',
format = 'zto,pvalue',
visible = '(shwSig)'
)
}
# Empty cells above and put "-" in the main diagonal-------------------
for (i in seq_along(var)) {
values <- list()
for (j in seq(i, length(var))) {
values[[paste0(var[[j]], '[r]')]] <- ''
values[[paste0(var[[j]], '[rp]')]] <- ''
}
values[[paste0(var[[i]], '[r]')]] <- '\u2014'
values[[paste0(var[[i]], '[rp]')]] <- '\u2014'
matrix$setRow(rowKey = var[[i]], values)
}
# initialize setNote-------------------------------------------------
matrix$setNote('ctlNte', ifelse(length(varCtl) > 0, paste0('Controlling for ', paste(varCtl, collapse=", ")),
'Not controlling for any variables, the result table shows Pearson correlation matrix'))
matrix$setNote('sigNte', paste0(
ifelse(
self$options$get('sidSig') == 'onetailed',
'One-tailed significance',
'Two-tailed significance'
),
ifelse(
self$options$get('flgSig'),
': * p < .05, ** p < .01, *** p < .001',
''
)
))
if (length(self$options$vars) <= 1)
self$setStatus('complete')
},
#====================================================================
.run = function() {
# get variables--------------------------------------------------
matrix <- self$results$get('matrix')
var <- self$options$get('vars')
nVar <- length(var)
varCtl <- self$options$get('ctrlvars')
nCtl <- length(varCtl)
data <- self$data
for(v in var)
data[[v]] <- jmvcore::toNumeric(data[[v]])
for(v in varCtl)
data[[v]] <-jmvcore::toNumeric(data[[v]])
# Computing correlations----------
if (nVar > 1) {
m <-
as.matrix(stats::cor(data[, c(var, varCtl)],
use="pairwise.complete.obs",
method = 'pearson'))
X <- m[var, var]
if (nCtl > 0) {
Y <- m[var, varCtl]
pi <- solve(m[varCtl, varCtl])
Rp <- cov2cor(X - Y %*% pi %*% t(Y))
} else {
Rp <- X
}
df <- dim(data)[1] - nCtl
Rt <- (Rp * sqrt(df - 2)) / sqrt(1 - Rp ^ 2)
if (self$options$sidSig == 'onetailed') {
nt = 1
} else {
nt = 2
}
Pp <- -nt * expm1(pt(abs(Rt), (df - 2), log.p = TRUE))
# populate results------------------------------------------------
for (i in 2:nVar) {
for (j in seq_len(i - 1)) {
values <- list()
values[[paste0(var[[j]], '[r]')]] <-
Rp[i, j]
values[[paste0(var[[j]], '[rp]')]] <-
Pp[i, j]
matrix$setRow(rowNo = i, values)
if (self$options$get('flgSig')) {
if (Pp[i, j] < .001)
matrix$addSymbol(rowNo = i, paste0(var[[j]], '[r]'), '***')
else if (Pp[i, j] < .01)
matrix$addSymbol(rowNo = i, paste0(var[[j]], '[r]'), '**')
else if (Pp[i, j] < .05)
matrix$addSymbol(rowNo = i, paste0(var[[j]], '[r]'), '*')
}
}
}
}
# Patial plot----------------
var <- self$options$vars
varCtl <- self$options$ctrlvars
if(is.null(varCtl)){
partial <- psych::partial.r(data)
} else{
partial <- psych::partial.r(data,x=var, y=varCtl)
}
image1 <- self$results$plot1
image1$setState(partial)
# Matrix plot-----------
image3 <- self$results$plot3
image3$setState(as.matrix(partial))
# EBIC PLOT------------
if(isTRUE(self$options$plot || self$options$plot2)){
if(is.null(varCtl)){
# Compute correlations:
CorMat <- qgraph::cor_auto(data)
} else{
CorMat <- qgraph::cor_auto(data, select = var)
}
# Compute graph with tuning = 0.5 (EBIC)
EBICgraph <- qgraph::EBICglasso(CorMat, nrow(data), 0.5, threshold = TRUE)
# Prepare Data For Plot -------
image <- self$results$plot
image$setState(EBICgraph)
# Centrality plot-------
image2 <- self$results$plot2
image2$setState(EBICgraph)
}
#---------------------------------------
if(isTRUE(self$options$pm)){
self$results$text1$setContent(partial)
}
#---------------------------------------
if(isTRUE(self$options$ebic)){
self$results$text$setContent(CorMat)
}
},
#================================================================
.plot = function(image, ggtheme, theme,...) {
if (is.null(image$state))
return(FALSE)
EBICgraph <- image$state
plot <- qgraph( EBICgraph, layout = "spring", details = TRUE)
# plot <- plot+ggtheme
print(plot)
TRUE
},
# Centrality plot for EBIC------------
.plot2 = function(image2, ggtheme, theme,...) {
if (is.null(image2$state))
return(FALSE)
scale <- self$options$scale
EBICgraph <- image2$state
plot2<- qgraph::centralityPlot(EBIC = EBICgraph,
scale=scale)
plot2 <- plot2+ggtheme
print(plot2)
TRUE
},
# partial plot-----------
.plot1 = function(image1,ggtheme, theme, ...) {
if (is.null(image1$state))
return(FALSE)
partial <- image1$state
plot1 <- qgraph(partial, layout = "spring", details = TRUE)
# plot1 <- plot1+ggtheme
print(plot1)
TRUE
},
.plot3 = function(image3,...) {
if (is.null(image3$state))
return(FALSE)
partial <- image3$state
plot3<- corrplot::corrplot(partial,
type="lower",
col=c("black", "white"),
bg="lightblue")
print(plot3)
TRUE
}
)
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.