データセットのいくつかの要素間の相関関係をプロットしたいと思います。可能であれば、これらのプロットされた値にエラーバーまたはひげを追加したいと思います。値を計算する前に、まず、いずれかの列の値に従ってそれらをグループ化します。できれば整然とした解決策を使用したいと思います。 cor()
を使用してこの半分を達成できますが、p値を含む列を追加する方法がわかりません。
iris
データセットは、私がかなりうまくやりたいことを示していると思います。実際のデータは、x軸に沿った時系列を使用します。 spearman
が指定されているのは、それが分析で使用された相関関係であり、iris
データセットでの正しい選択ではないためです。他にいくつかの posts がcor.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 ###
ほとんど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))
これは、求められていることを実現するバージョンです。ステップに分解すると、上記の例よりも少し長くなります。このバージョンはベース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
の注を参照してください。]
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()