实际上有两个问题,一个比另一个更高级。
Q1:我正在寻找一种类似于corrplot()
但可以处理因子的方法。
我最初尝试使用chisq.test()
,然后计算 * p值 * 和 Cramer 's V 作为相关性,但需要计算的列太多了。因此,有人能告诉我是否有一种快速的方法来创建一个“corrplot”,使每个单元格包含 Cramer' s V 的值,而颜色由 * p值 * 呈现。或任何其他类型的类似图。
关于 Cramer的V,让我们假设tbl
是二维因子数据框。
chi2 <- chisq.test(tbl, correct=F)
Cramer_V <- sqrt(chi2$/nrow(tbl))
我准备了一个测试数据框架,包含以下因素:
df <- data.frame(
group = c('A', 'A', 'A', 'A', 'A', 'B', 'C'),
student = c('01', '01', '01', '02', '02', '01', '02'),
exam_pass = c('Y', 'N', 'Y', 'N', 'Y', 'Y', 'N'),
subject = c('Math', 'Science', 'Japanese', 'Math', 'Science', 'Japanese', 'Math')
)
Q2:然后,我想计算混合类型 Dataframe 上的相关性/关联矩阵,例如:
df <- data.frame(
group = c('A', 'A', 'A', 'A', 'A', 'B', 'C'),
student = c('01', '01', '01', '02', '02', '01', '02'),
exam_pass = c('Y', 'N', 'Y', 'N', 'Y', 'Y', 'N'),
subject = c('Math', 'Science', 'Japanese', 'Math', 'Science', 'Japanese', 'Math')
)
df$group <- factor(df$group, levels = c('A', 'B', 'C'), ordered = T)
df$student <- as.integer(df$student)
4条答案
按热度按时间rslzwgfq1#
如果您想要因子或混合类型的真正相关图,您还可以使用
model.matrix
对所有非数值变量进行one-hot编码。这与计算Cramér 's V有很大不同,因为它会像许多回归模型一样将因子视为单独变量。然后,您可以使用您最喜欢的相关图库。我个人喜欢
ggcorrplot
,因为它兼容ggplot2
。以下是您的数据集示例:
vc6uscn92#
@AntoniosK的解决方案可以按照@J.D.的建议进行改进,以允许混合数据框架,包括标称 * 和 * 数值属性。关联强度的计算包括使用偏差校正Cramer's V的标称与标称、使用Spearman(默认)或Pearson相关的数值与数值以及使用ANOVA的标称与数值。
使用该方法,我们可以容易地分析大范围的混合变量 Dataframe :
x一个一个一个一个x一个一个二个x
这也可以与优秀的
corrr
包一起使用,例如,用于绘制相关性网络图:dfty9e193#
下面是一个
tidyverse
解决方案:请注意,我使用
lsr
包来计算Cramers V(使用cramersV
函数)。vh0rcniy4#
关于Q1,如果首先使用?structable(来自同一个包)转换 Dataframe ,则可以使用vcd包中的?pairs.table。这将为您提供mosaic plots的绘图矩阵。这与
corrplot()
的功能不太相同,但我认为它将是一个更有用的可视化。还有很多其他的图也适用于分类-分类数据,比如筛图、关联图和压力图(请参见我在Cross Validated上的问题:您可以编写自己的基于pairs的函数,将您想要的内容放入上三角形面板或下三角形面板中(请参阅我的问题:Pairs matrix with qq-plots),如果你不喜欢马赛克图。只要记住,虽然绘图矩阵是非常有用的,他们只显示边缘投影(要更全面地理解这一点,请参阅我的回答CV在这里:Is there a difference between 'controlling for' and 'ignoring' other variables in multiple regression?,此处:Alternatives to three dimensional scatter plot)。
关于Q2,您需要编写一个自定义函数。