web-dev-qa-db-ja.com

group_byを使用して相関とp値のデータフレームを作成し、Rのエラーバーでプロットします。

データセットのいくつかの要素間の相関関係をプロットしたいと思います。可能であれば、これらのプロットされた値にエラーバーまたはひげを追加したいと思います。値を計算する前に、まず、いずれかの列の値に従ってそれらをグループ化します。できれば整然とした解決策を使用したいと思います。 cor()を使用してこの半分を達成できますが、p値を含む列を追加する方法がわかりません。

irisデータセットは、私がかなりうまくやりたいことを示していると思います。実際のデータは、x軸に沿った時系列を使用します。 spearmanが指定されているのは、それが分析で使用された相関関係であり、irisデータセットでの正しい選択ではないためです。他にいくつかの postscor.testの使用を提案し、そこから値を取得するのを見ましたが、それをエラーとして使用するために棒グラフにどのように適用するかはわかりませんバー。以下の基本的な棒グラフを作成するコードです。

Edit私の例を、mtcarsデータセットを使用することから、irisデータセットに変更しましたそれは私のデータをよりよく反映しています。 jay.sfによる質問への最初の回答はmtcarsセットで機能し、高く評価されましたが、データセットでは機能せず、irisセットは同じエラーをスローしました。さらに、私はオリジナルでこれを述べていませんでしたが、整然とした解決策が望ましいですが、必要ではありません。

私が探している答えはここに含まれていると思いますが、私はまだ詳細を解明しようとしています: https://dominicroye.github.io/en/2019/tidy-correlation-tests -in-r /

iristest <- iris %>%
  group_by(Species) %>%
  summarise(COR = cor(Sepal.Length,Sepal.Width, method = "spearman", use="complete.obs"))

ggplot(data = iristest) +
  aes(x = Species, y = COR) +
  geom_bar(stat = "identity") +
  theme_minimal()

そのまま、iristestは次の出力を提供します。

    Species     COR
1   setosa      0.7553375
2   versicolor  0.5176060
3   virginica   0.4265165

理想的には、COR列の後にp値が追加された出力が欲しいと思います。

    Species     COR          p-value
1   setosa      0.7553375    ###
2   versicolor  0.5176060    ###
3   virginica   0.4265165    ###

enter image description here

3
Corey

ほとんどtidyverseを使用しています...

スピアマンとの相関関係は次のとおりです。

library(tidyverse)
library(RVAideMemoire)

iristest <-  iris %>%
+ group_by(Species) %>%
+ group_modify(~ glance(spearman.ci(.x$Sepal.Width, .x$Sepal.Length))


iristest
# A tibble: 3 x 5
# Groups:   Species [3]
  Species    estimate conf.low.Inf conf.high.Sup method                     
  <fct>         <dbl>        <dbl>         <dbl> <chr>                      
1 setosa        0.755        0.599         0.857 Spearman's rank correlation
2 versicolor    0.518        0.251         0.724 Spearman's rank correlation
3 virginica     0.427        0.131         0.653 Spearman's rank correlation

Ggplotを使用しています...

ggplot(iristest, aes(x = Species, y = estimate)) 
+ geom_bar(stat="identity") 
+ geom_errorbar(aes(ymin=conf.low.Inf, ymax=conf.high.Sup), width=.2, position=position_dodge(.9))

bar graph of correlation estimate by species

1
indubitably

これは、求められていることを実現するバージョンです。ステップに分解すると、上記の例よりも少し長くなります。このバージョンはベースRのみを使用しますが、これは一部のユーザーにとって興味深いかもしれません。

# Just extract the columns used in your question
data = iris[, c("Sepal.Length", "Sepal.Width", "Species")]

# Group the data by species
grouped.data = by(data, (data$Species), list)
# Run the function 'cor.test' (from stats) over the data from each species
cor.results = lapply(grouped.data, function(x) cor.test(x$Sepal.Length, x$Sepal.Width, method = "spearman", exact = FALSE) )
# Extract the rho and p-value
rho = sapply(cor.results, "[[", "estimate"))
p = sapply(cor.results, "[[", "p.value")
# Bundle the results into a data.frame (or whatever data structure you prefer)
data.frame(Species = names(cor.results), COR = rho, `p-value` = p, row.names = NULL)
     Species       COR      p.value
1     setosa 0.7553375 2.316710e-10
2 versicolor 0.5176060 1.183863e-04
3  virginica 0.4265165 2.010675e-03

[これらのデータに必要な?cor.testの使用については、exact = FALSEの注を参照してください。]

0
randr

cor.testは、実際にすべてが必要なものが格納されているリストを生成します。したがって、必要な値を取得する関数を記述してください。ここでは、リストを生成するbyを使用できます。これにより、rbindを使用して、プロットするための完全な行名を持つ行列を取得できます。リストのデータフレームのrbindにはdo.callが必要です。

res <- do.call(rbind, by(iris, iris$Species, function(x) { 
  rr <- with(x, cor.test(Sepal.Length, Sepal.Width, method="pearson")) 
  return(c(rr$estimate, CI=rr$conf.int)) 
})) 
#                  cor       CI1       CI2
# setosa     0.7425467 0.5851391 0.8460314
# versicolor 0.5259107 0.2900175 0.7015599
# virginica  0.4572278 0.2049657 0.6525292

method="spearman"irisなどのタイのあるデータでは機能しないことに注意してください。そこで、ここでは"pearson"を使用しました。

データをプロットするには、Rに付属するbarplotをお勧めします。バーの場所b <-を保存し、arrowsのx座標として使用します。 y座標については、マトリックスから値を取得します。

b <- barplot(res[,1], ylim=c(0, range(res)[2]*1.1), 
             main="My Plot", xlab="cyl", ylab="Cor. Sepal.Length ~ Sepal.Width")
arrows(b, res[,2], b, res[,3], code=3, angle=90, length=.1)
abline(h=0)
box()

enter image description here

0
jay.sf