我有一份包含 30 个问题的问卷,分为 3 个块,每块 10 个问题。每个问题都用数字 1 到 10 回答,然后计算所有问题的平均值。我需要知道每个块对最终分数的贡献(如果可能的话 - 每个问题贡献了多少)。我该怎么做呢?我可以访问 R。
如何对问卷数据进行三块30个项目的因子分析?
我认为您需要的是多重对应分析(MCA)。您可以在Wikipedia上查找基础知识。
MCA 是 R-core 的一部分,在 MASS 包中。所以我建议你从
library(MASS)
?mca
这是该功能的帮助页面mca。
MCA 的输出是一组有序因子,用于捕捉变量之间的关系。第一个因素的绝对负荷(即变量在第一个因素上的投影坐标)表示哪些变量组对变化的影响最大。
正如评论中所指出的,MCA 使用分类变量而不是数值变量。这意味着将不考虑有序关系 (1 < 2 < 3 < ... < 10)。MCA 的适用程度取决于您的问题的性质。例如,如果这些是分箱数值变量(例如月收入/1000,四舍五入),那么我会说 MCA 是不合适的。如果这些是主观评价(例如“伤害有多大?”),那么我会试一试,因为这些类别有时可以很好地显示变量之间的非线性关系。
要在实践中做到这一点,在 R 中,您将在data.frame30 列中显示您的数据,并且您拥有的行数与您的个人数一样多。每列都是 a 形式的问题的答案factor,也就是说,a 9 将被解释为类别9,而不是分数 9。
假设您已将其收集到data.frame您调用的名称中,answers您可以执行以下操作:
mca_result <- mca(answers)
plot(mca_results)
您将有一个代表个人的双图,问题的答案(作为类别)以及所有这些通过空间接近度表示的关系。在该空间上彼此靠近的两个人给出了相似的答案,在该空间上彼此靠近的两个答案是由同一个人选择的。类似地,接近一组答案的个人选择了其中的许多人,并且他们中的许多人选择了接近一组人的答案。
MCA 本身不适应块设计。一个可能提供信息的解决方法是将每个块的答案的负载的平方与第一个因素相加。载荷的平方称为惯性,它表示变量(问题的答案)的变化在仅由该因子组成的更简单模型中表示多少。在 R 中,您可以这样做:
inertia_on_1 <- mca_results$cs[,1]^2
tapply(X=inertia_on_1, INDEX=rep(1:3, each=100), sum)
所说的部分INDEX=rep(1:3, each=100)是建立一个与每个块的变量相对应的索引(标记为 1、2 和 3)——每个块有 100 个(因为你有 10 个类别用于 10 个问题)。
一种方法是计算三个块中的每一个中的第一个主成分,然后以您的最终分数作为响应变量并将这三个块分数作为解释变量进行回归。在我看来,这似乎是回答您的问题的一种方法,即每个块对最终分数的差异有多大贡献。
您也可以在单个问题级别执行相同的基本方法,方法是跳过主要组件部分。
下面粘贴了一些非常简单的 R 代码来执行 Block 方法。这会跳过各种事情,例如诊断检查、绘制数据、查看第一个主成分解释的每个块内有多少方差等。
还要注意——即使是完全随机的数据,其中一个块将与最终得分更紧密地联系在一起——你需要仔细考虑如何解释它!
# simulate random data
x <- matrix(sample(1:10, 3000, replace=TRUE), nrow=100)
# create score as you say it is calculated
score <- apply(x,1, mean)
# estimate a score for the principal component of each block
BlockA <-predict(princomp(x[,1:10]))[,1]
BlockB <-predict(princomp(x[,11:20]))[,1]
BlockC <-predict(princomp(x[,21:30]))[,1]
# fit a model
summary(lm(score ~ BlockA + BlockB + BlockC))