Я застрял на последнем этапе своего анализа, когда я пытаюсь вычислить факторные оценки из моего факторного анализа.
Я получаю следующую ошибку. Я проверил, совпадает ли количество строк / столбцов матричного умножения, поэтому я не понимаю, как исправить этот код, и был бы признателен за некоторую помощь.
Error in e$vectors %*% diag(inv.sqrt.ev) : non-conformable argument
Вот мой тестовый набор данных :
library(dplyr)
library(pysch)
library(polycor)
dat_x = data.frame(fp_energy = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07)),
fp_gripstrength = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.21, 0.21)),
fp_walktime = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.2, 0.2)),
fp_metmins = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.18, 0.18)),
fp_weightloss = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07))
)
x = dat_x %>% mutate_all(as.factor)
dat_y = data.frame(fi_fl025_01 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.02, 0.02)),
fi_fl025_02 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.05, 0.05)),
fi_fl025_03 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.04, 0.04)),
fi_ph102 = sample(c(0, 0.25, 0.5, 0.75, 1), size=5000, replace=TRUE, prob=c(0.19, 0.37, 0.33, 0.08, 0.02)),
fi_ph108 = sample(c(0, 0.25, 0.5, 0.75, 1), size=5000, replace=TRUE, prob=c(0.28, 0.30, 0.28, 0.11, 0.02)),
fi_ph201_01 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.36, 0.36)),
fi_ph201_02 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.05, 0.05)),
fi_ph201_03 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.04, 0.04)),
fi_ph201_08 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.37, 0.37)),
fi_ph201_10 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07)),
fi_ph201_11 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.03, 0.03)),
fi_ph301_03 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.27, 0.27)),
fi_ph502 = sample(c(0, 0.33, 0.66, 1), size=5000, replace=TRUE, prob=c(0.65, 0.10, 0.16, 0.09)),
fi_ph503_03 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07)),
fi_fl001_01 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07)),
fi_fl001_05 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.3, 0.3)),
fi_fl001_06 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.07, 0.07)),
fi_fl001_08 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.08, 0.08)),
fi_fl001_09 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.12, 0.12)),
fi_fl001_10 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.18, 0.18)),
fi_fl001_11 = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.4, 0.4)),
fi_DISconverse1 = sample(c(0, 0.5, 1), size=5000, replace=TRUE, prob=c(0.93, 0.06, 0.01)),
fi_MDpolypharmacy = sample(0:1, size=5000, replace=TRUE, prob=c(1-0.2, 0.2))
)
y = dat_y %>% mutate_all(as.factor)
И мои коды:
# Compute correlations
pc_x = hetcor(x)
pc_y = hetcor(y)
# EFA to obtain first-order solutions
efa_x = fa(pc_x$correlations, nfactors=2, n.obs=nrow(x), fm="wls", rotate="promax")
efa_y = fa(pc_y$correlations, nfactors=4, n.obs=nrow(y), fm="wls", rotate="promax")
# Factor the first-order solutions to obtain second-order solutions
efa2_x = fa(efa_x$Phi, nfactors=1, rotate="varimax", fm="pa")
efa2_y = fa(efa_y$Phi, nfactors=1, rotate="varimax", fm="pa")
# Compute the second-order product matrix, i.e. the general factor loadings
efa2_x.g = efa_x$loadings %*% efa2_x$loadings
efa2_y.g = efa_y$loadings %*% efa2_y$loadings
# Compute factor scores using these general factor loadings
fctscores_x = factor.scores(dat_x, efa2_x.g, method="tenBerge")$scores
fctscores_y = factor.scores(dat_y, efa2_y.g, method="tenBerge")$scores
## this is where I get the error
Чтобы дать вам общее представление о том, что я пытаюсь сделать: у меня есть 2 инструмента для измерения слабости пожилых людей (X и Y ). X имеет 5 двоичных элементов, а Y - 23 элемента (смесь двоичных и порядковых номеров). Я провел исследовательский факторный анализ с ротацией promax и нашел двухфакторное решение для X и четырехфакторное решение Y. Для каждого из этих инструментов я хотел бы вычислить единую составную факторную оценку, применив факторное решение второго порядка.