2016-02-24 4 views
0

Я использую модифицированную версию функции pairs для получения матрицы диаграммы рассеивания:Участок рассеивания матрица с частичной коэффициентами корреляции в R

pairs.cor <- function (x,y,smooth=TRUE, digits=2, ...) 
{ 
    panel.cor <- function(x, y, ...) 
    { 
    usr <- par("usr"); on.exit(par(usr)) 
    par(usr = c(0, 1, 0, 1)) 
    r.obj = cor.test(x, y,use="pairwise",...) 
    r = as.numeric(r.obj$estimate) 
    p = r.obj$p.value 
    mystars <- ifelse(p < .05, "* ", " ") 
    txt <- format(c(r, 0.123456789), digits=digits)[1] 
    txt <- paste(txt, mystars, sep="") 
    text(0.5, 0.5, txt) 
    } 
panel.hist <- function(x) 
    { 
    usr <- par("usr"); on.exit(par(usr)) 
    par(usr = c(usr[1:2], 0, 1.5)) 
    h <- hist(x, plot = FALSE) 
    breaks <- h$breaks; nB <- length(breaks) 
    y <- h$counts; y <- y/max(y) 
    rect(breaks[-nB], 0, breaks[-1], y, col="cyan") 
    } 
pairs(x,diag.panel=panel.hist,lower.panel=panel.cor,upper.panel=panel.smooth, ...) 
} 

pairs.cor(iris[,1:4]) 

который выглядит следующим образом:

enter image description here

Я хотелось бы сделать, чтобы коэффициенты частичной корреляции вместо парного сигнала Пирсона в нижнюю панель.

можно рассчитать частные коэффициенты корреляции легко:

library(ppcor) 
pcor(iris[,1:4])$estimate 

Но я не мог понять, как изменить нижнюю функцию панели panel.cor так, что он показывает эти значения. Проблема заключается в том, что функция нижней панели обрабатывает пары значенийи y, тогда как функция частичной корреляции pcor требует всего кадра данных (или матрицы).

ответ

1

Похоже, pairs не делает это очень просто. Самое простое, что я мог придумать, - это получить panel.cor заглянуть в родительский data.frame, чтобы найти индекс строки/столбца для текущей панели, а затем вы можете использовать его для индексации в предварительно рассчитанные значения. Вот обновленный panel.cor функция

panel.cor <- function(x, y, ...) { 
    env <- parent.frame(2) 
    i <- env$i 
    j <- env$j 
    usr <- par("usr"); on.exit(par(usr)) 
    par(usr = c(0, 1, 0, 1)) 
    r = as.numeric(pp[i,j]) 
    txt <- format(c(r, 0.123456789), digits=digits)[1] 
    text(0.5, 0.5, txt) 
} 

Здесь используют использование parent.frame(2) фактически захватить локальные переменные i и j из функции pairs.default. И мы предполагаем, что pp содержит значения от pcor. Таким образом, вы должны определить эту переменную перед вызовом pairs.cor

pp <- ppcor::pcor(iris[,1:4])$estimate 
pairs.cor(iris[,1:4]) 

Это дает следующий результат

enter image description here

Смежные вопросы