R/partial.r.R

"partial.r" <-
function(data,x,y,use="pairwise",method="pearson",part=FALSE)  {
 cl <- match.call()
 #convert formula input into prior format
 #x are the set from which y is partialled
 
if(!missing(x))  { if(inherits(x,"formula")) {
   ps <- fparse(x)
   y <- ps$y
   x <- ps$x
   z <- ps$z   #do we have any variable to partial out
   ex <- ps$ex
   
   #now put it into old form
   x <- c(y,x)
   yy <- y  #we need to keep the name(s) of the dependent variables
   y <- z   #we partial these from x 
}
}
   if(!isCorrelation(data)) {n.obs <- dim(data)[1]
    if(!missing(x) & !missing(y)) {if(!is.character(x) ) x <- colnames(data)[x]
       if(!is.character(y) ) y <- colnames(data)[y]
        data <- cor(data[,c(x,y)],use=use,method=method)
         } else {if(is.null(dim(data))) stop("Specify the rows for data (use , for all rows)")
                    data <- cor(data,use=use,method=method) }}
   m <- as.matrix(data)
 #if(missing(x) & missing(y)) {X.resid <- -(solve(m))  #this is thus the image covariance matrix
 if(missing(x) & missing(y)) {X.resid <- -(Pinv(m))  #this is thus the image covariance matrix
    diag(X.resid) <- 1/(1- smc(m))    #adjust the diagonal to be 1/error
    X.resid <- cov2cor(X.resid)
    rownames(X.resid) <-colnames(X.resid) <- colnames(m)} else {
        if(missing(x)){ x <- colnames(data)
        y <- as.character(y)
        x <- x[!x %in% y]}
               
        xy <- c(x,y)                     
     	X <- m[x,x]
     	Y <- m[x,y]
     	phi <- m[y,y]
       # phi.inv <- solve(phi)
       phi.inv <- Pinv(phi)
        X.resid <- X - Y %*% phi.inv %*% t(Y)
        
      
        if(part) if(length(yy) >1) {diag(X.resid[yy,yy]) <- 1} else {X.resid[yy,yy] <- 1}
        X.resid <- cov2cor(X.resid) 
        class(X.resid)  <- c("psych","partial.r", "matrix") }
       
        return(X.resid)
     	}
     #modified March 23 to use cov2cor instead of the sd line.  This makes the diagonal exactly 1.
     #05/08/17  Completely rewritten to be easier to use and follow for the case of complete partials 
     #modified 03/19/19 to just choose the items to correlate instead of entire matrix
     #modified 07/25/20 to use the Pseudo Inverse so that in cases of improper matrices, we still give a partial
     #modified 06/09/21 to add the matrix class to the object.
     #modified 12/3/21 to add formula input option
     #modified 12/5/23 to add the ability to do part correlations (suggested by Rick Zinbarg)
     
     

Try the psych package in your browser

Any scripts or data that you put into this service are public.

psych documentation built on June 27, 2024, 5:07 p.m.