12

特定のポイントの上下に相関があり、p値が0.01未満の変数(列)間のグラフを生成したいと思います。グラフは、相関する2つの列(変数)をプロットするggplot2(線または棒)グラフになります。

これが私のこれまでのアプローチの要点です。いくつかのダミーデータを使用して、次に進む場所へのポインタが欲しいです。

# Create some dummy data
df <- data.frame(sample(1:50), sample(1:50), sample(1:50), sample(1:50))
colnames(df) <- c("var1", "var2", "var3", "var4")

# Find correlations in the dummy data
df.cor <- cor(df)

# Make up some random pvalues for this example
x <- 0:1000
df.cor.pvals <- data.frame(sample(x/1000, 4), sample(x/1000, 4), sample(x/1000, 4), sample(x/1000,4))
colnames(df.cor.pvals) <- c("var1", "var2", "var3", "var4")

# Find the significant correlations
df.cor.extreme <- ((df.cor < -0.01 | df.cor > 0.01) & df.cor.pvals < 0.5)

# Ready data to for plotting
df$rownames <- rownames(df)
df.melt <- melt(df, id="rownames")

# I want to plot the combinations of variables that have a TRUE value
# in the df.cor.extreme matrix 

以下は、var1とvar2の値がTRUEの場合のハードコードされた例です。これは、varAとvarBが相関している複数のプロットを生成するために何らかのループが必要な場所だと思います。

ggplot(df.melt[(df.melt$variable=="var1" | df.melt$variable=="var2"),], aes(x=rownames, y=value, group=variable, colour=variable)) +
  geom_line()

プロット例

4

2 に答える 2

8

@DrewSteenのコメントで述べたように、p-avlueはcorと同じ形状である必要があります。

ここでは、p値行列を計算する関数を提供します(統計パッケージに組み込み関数が存在する必要があります)

pvalue.matrix <- function(x,...){
  ncx <- ncol(x)
  r <- matrix(0, nrow = ncx, ncol = ncx)
  for (i in seq_len(ncx)) {
    for (j in seq_len(i)) {
      x2 <- x[, i]
      y2 <- x[, j]
      r[i, j] <-  cor.test(x2,y2,...)$p.value
    }
  }
  r <- r + t(r) - diag(diag(r))
  rownames(r) <- colnames(x)
  colnames(r) <- colnames(x)
  r
}

次に、|のベクトル化バージョンを使用します。そして&このように

df.cor.sig <- (df.cor > 0.01 | df.cor < -0.01) & pvalue.matrix(df) < 0.5

プロットはgeom_tileで古典的です

library(reshape2) ## melt
library(plyr)     ## round_any
 library(ggplot2) 
dat <- expand.grid(var1=1:4, var2=1:4)
dat$value <- melt(df.cor.sig)$value
dat$labels <- paste(round_any(df.cor,0.01) ,'(', round_any(pvalue.matrix(df),0.01),')',sep='')
ggplot(dat, aes(x=var1,y=var2,label=labels))+ 
  geom_tile(aes(fill = value),colour='white')+
 geom_text()

ここに画像の説明を入力してください

OPの説明後に編集する

plots <- apply(dat,1,function(x){
    plot.grob <- nullGrob()
    if(length(grep(pattern='TRUE',x[3])) >0 ){
      gg <- paste('var',c(x[1],x[2]),sep='')
      p <- ggplot(subset(df.melt,variable %in% gg ), 
            aes(x=rownames, y=value, group=variable, colour=variable)) +
            geom_line()
      plot.grob <- ggplotGrob(p)
    }
    plot.grob

})


library(gridExtra)
do.call(grid.arrange,  plots)

ここに画像の説明を入力してください

于 2012-12-28T06:03:11.070 に答える
1

自分でこれを行っている場合は、@agstudyの回答に追加したかっただけです。

重要度を適用できる行列インデックスのテーブルを生成する関数の結果を試してみる場合。つまり、この行:

dat <- expand.grid(var1=1:4, var2=1:4)

また、上の行のハードコードされた4は、(正方形の)グリッドの長さであることを忘れないでください。とにかく、次のようなコードを実行することで、重複するグラフの生成を無視できます。

# Find redunant pairs
dat <- data.frame(t(apply(dat, 1, function(x){
  if(x[1]-x[2] <= 0) {    # If > zero than pair has come before.
    -x                    # If = zero than pair is same 
  } else x
})))

# Remove redundant pairs
dat <- dat[dat$var1>0,]

楽しみ!

于 2013-02-26T06:56:36.627 に答える