从R

时间:2015-06-16 04:39:51

标签: r pca missing-data factor-analysis

我使用factanal()对R中的几个变量进行因子分析(但我愿意使用其他包)。我想确定每个案例的因子得分,但我希望因子得分是非标准化的,并且要求输入变量的原始度量。当我运行因子分析并获得因子分数时,它们被标准化为均值分布均值= 0,SD = 1,并且不在输入变量的原始度量上。如何获得与输入变量具有相同度量标准的非标准化因子得分?理想情况下,这意味着类似的均值,sd,范围和分布。

之前我曾问过similar question,但受访者的回答涉及重新规范标准化(即正态分布)因子得分。请注意,我不想将标准化因子分数转换为非标准因子分数,因为我的指标的分布是非正常的(即标准化因子分数的正态分布不能轻易转换为我的指标的原始度量)。换句话说,我想估算指标原始指标的非标准化因子得分,而不是先用标准化指标估算它们。

此外,还有一些缺失的数据。如何为所有案例获得(非标准化)因子分数,即使那些没有所有项目数据的人也可以获得(非标准化)因子分数?

这是一个小例子:

library(psych)

v1 <- c(1,1,1,NA,1,1,1,1,1,1,3,3,3,3,3,4,5,6)
v2 <- c(1,2,1,1,1,1,2,1,2,1,3,4,3,3,3,4,6,5)
v3 <- c(3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,5,4,6)
v4 <- c(3,3,4,3,3,1,1,2,NA,1,1,1,2,1,1,5,6,4)
v5 <- c(1,1,1,1,1,3,3,3,3,3,1,1,1,1,1,6,4,5)
v6 <- c(1,1,1,2,1,3,3,3,4,3,1,1,NA,2,1,6,5,4)
m1 <- cbind(v1,v2,v3,v4,v5,v6)

m1FactorScores <- factanal(~v1+v2+v3+v4+v5+v6, factors = 1, scores = "Bartlett", na.action="na.exclude")$scores

describe(m1) #means~2.3, sds~1.5
describe(m1FactorScores) #mean=0, sd=1

以上数据只是一个小例子。我的实际数据不是像素/序数据。他们是对足球运动员的预测。从各种渠道传球。我希望是一个潜在的平均值&#34;会更准确地预测玩家&#39;传球比平均值多,因为它会丢弃每个来源的独特偏差。然而,数据是高度正偏差的,并且迫使潜在变量及其因子得分正常分布导致许多玩家的价值高得令人难以置信(例如,下个赛季超过6,000码)。

1 个答案:

答案 0 :(得分:1)

问题是:您之前提问的答案仍然正确。 是否提前修正潜在变量的比例或重新缩放标准化变量是无关紧要的,因为得到的分数将是相同的。

以下是使用lavaan的插图,包括两个选项。据我所知,factanal不支持修正因子加载和截距:

library(lavaan)

v1 <- c(1,1,1,2,1,1,1,1,1,1,3,3,3,3,3,4,5,6)
v2 <- c(1,2,1,1,1,1,2,1,2,1,3,4,3,3,3,4,6,5)
v3 <- c(3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,5,4,6)
v4 <- c(3,3,4,3,3,1,1,2,NA,1,1,1,2,1,1,5,6,4)
v5 <- c(1,1,1,1,1,3,3,3,3,3,1,1,1,1,1,6,4,5)
v6 <- c(1,1,1,2,1,3,3,3,4,3,1,1,NA,2,1,6,5,4)
m1 <- data.frame(v1,v2,v3,v4,v5,v6)

# Option 1: fixing the scale according to v1
mean(v1) # 2.278
var(v1)  # 2.448

fix.model <- "f1 =~ v1 + v2 + v3 + v4 + v5 + v6
              f1 ~ 2.278*1
              f1 ~~ 2.448*f1"

fix.fit <- lavaan(fix.model, data = m1, meanstructure=TRUE, missing="fiml", 
                  int.ov.free = TRUE, int.lv.free = TRUE, auto.var = TRUE)

# Option 2: fixing the scale to standardize the latent variable
std.model <- "f1 =~ v1 + v2 + v3 + v4 + v5 + v6
              f1 ~ 0*1
              f1 ~~ 1*f1"

std.fit <- lavaan(std.model, data = m1, meanstructure=TRUE, missing="fiml", 
                  int.ov.free = TRUE, int.lv.free = TRUE, auto.var = TRUE)

# extract scores
fix.scores <- predict(fix.fit)[,1]
std.scores <- predict(std.fit)[,1]
rescaled <- std.scores * sd(v1) + mean(v1)

请注意fix.scoresrescaled得分之间惊人的相似之处。

cbind(std.scores, rescaled, fix.scores)

#      std.scores  rescaled fix.scores
# [1,] -0.8220827 0.9916157  0.9917591
# [2,] -0.8113431 1.0084179  1.0085627
# [3,] -0.8098929 1.0106869  1.0108318
# [4,] -0.5844884 1.3633359  1.3635066

出于模型拟合的目的,为潜在变量选择的比例是完全任意的。 无论您的选择如何,无论指标的实际分布如何,潜在变量(即正常)和指标变量(即条件正常)的分布假设都是相同的。

如果您的指标违反了模型的分布假设,那么这将反映在较差的模型拟合或慢收敛中,但不会在两种方法中产生不同的结果。