计算和绘制一个变量对多个变量的相关性和置信区间

时间:2019-05-08 16:24:58

标签: r plot correlation

我有以下数据(此数据为头,实际数据为100行以上),由所有序数变量组成。在实际数据中,“床”的范围是1到8,所有“测试”变量的范围是1到4。我想计算和绘制每个“测试”变量与“床”的相关性,但是我不希望我想要一个完整的矩阵,因为我不想将“ Testx”变量相互关联。

这是数据的csv ...我将其另存为“ test.csv”

Beds,Test1,Test2,Test3,Test4,Test5,Test6,Test7,Test8
4,4,1,4,4,4,4,3,4
1,3,1,1,1,1,4,2,1
2,4,1,1,2,4,1,1,1
1,4,1,1,4,1,1,1,1
1,2,1,1,1,4,2,2,2
1,4,1,1,1,2,1,1,1
1,1,1,1,1,1,1,1,1
1,1,1,1,1,1,1,1,1
1,1,1,1,1,1,1,1,1
1,4,1,1,4,3,2,2,1

编辑:

我有一个可以工作但并不优雅的kluge:

test <- read.csv("test.csv")

#Initialize results table as blank dataframe
cTable <- data.frame(matrix(ncol=5, nrow=0))
colnames(cTable) <- c("Test", "Cor", "cL", "cH", "p")

#Begin correlation calculation for Test 1
df <- cor.test(test$Beds, test$Test1)

#Pull the 95% confidence interval and break it into upper and lower limits
interv <- as.character(df$conf.int)
cL <- as.numeric(strsplit(interv, " ")[[1]]) #lower 95% confidence limit
cH <- as.numeric(strsplit(interv, " ")[[2]]) #upper 95% confidence limit

t <- data.frame(Test="Test1", Cor=df$estimate, cL=cL, cH=cH, p=df$p.value)
rownames(t)<-NULL

cTable <- rbind(cTable, t)

rm(df,t) #Repeat code doesn't work unless temporary dataframes are cleared out

#Repeat for Test5
df <- cor.test(test$Beds, test$Test5)

interv <- as.character(df$conf.int)
cL <- as.numeric(strsplit(interv, " ")[[1]])
cH <- as.numeric(strsplit(interv, " ")[[2]])

t <- data.frame(Test="Test5", Cor=df$estimate, cL=cL, cH=cH, p=df$p.value)
rownames(t)<-NULL

cTable <- rbind(cTable, t)

rm(df,t)

这行得通,尽管这可能不是执行我想要的最佳方法,因为我现在必须对Test2到Test8重复它。但这有效。我为Test1和Test5运行了它,因为碰巧发生了,Test2的置信区间未定义。在实时数据中这不是问题。输出如下:

   Test       Cor          cL        cH          p
1 Test1 0.3947710 -0.31253956 0.8204642 0.25890218
2 Test5 0.5921565 -0.05974491 0.8899691 0.07128552

每个Testx的最终输出应该有一行。

另一个所需的输出是一个图,其中每个Textx在X轴上为序数,在Y轴上为相关系数,并显示了系数和置信区间。原来那部分很简单:

ggplot(cTable, aes(x=cTable$Test, y=cTable$Cor))+
  geom_point(size=4)+
  geom_errorbar(aes(ymax=cTable$cH, ymin=cTable$cL))

哪个会产生:

Plot of correlations with confidence intervals

因此,总而言之,我有我需要的东西,但是到达那里并不是很漂亮。在我看来,应该有一种方法可以用一些命令替换上面的重复代码,该命令将一列“床”并依次与所有其他列相关联,从而产生与此处相同的输出。

1 个答案:

答案 0 :(得分:0)

我知道了。答案是在corr.test中,它是“心理”软件包的一部分。它只需要对输出进行子集设置,以仅选择我想要的相关性,然后丢弃其余的相关性。

library("ggplot2")
library("data.table") #used for the %like% string operator
library ("psych")  #used for the corr.test function

test <- read.csv("test.csv")

cTab <- print(corr.test(test, use = "pairwise", method = "pearson", adjust = "none"), short=FALSE)
cTab <- cTab[rownames(cTab) %like% "Beds",] #Subsets the variable whose correlations I actually want
cTab$names <- rownames(cTab) #so I can use the rownames as the X variable

ggplot(cTab, aes(x=cTab$names, y=cTab$raw.r))+
  geom_point(size=4)+
  geom_errorbar(aes(ymax=cTab$raw.upper, ymin=cTab$raw.lower), width=0.3, size=0.75)+
  labs(x="Test", y="Correlation Coefficient")+
  theme(plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust=0.5, face = "italic"),
        axis.text.x = element_text(angle = 90, hjust = 1.0))

这是输出的样子(记住Test2包含错误的数据,我没有费心去修复它) Correlation coefficients with confidence intervals