我try 用simstudy软件包模拟数据,然后用psych软件包计算系数ω.我正在使用for循环来运行不同的值,用于簇内变异、项目间相关性和迭代次数.
我开始用3—10次迭代来测试这个问题,并不断从lavaan那里得到一个错误,说模型没有收敛.当我打开输出时,我可以看到for循环实际上正在返回到以前的值然后停止.例如,每个条件下10次迭代如下所示:
var = 0 + all values for rho - ran successfully
var = 0.5 + all values for rho - ran successfully
var = 1.0 + all values for rho - ran successfully
var = 1.5 + rho = 0.1 - 7 successful iterations, then reverted back to var = 1.0 + rho = 0.6 for the remaining 3 iterations in that loop then entire loop stopped prematurely.
我试着更新R、R Studio和R包.我运行它与和没有trycatch错误与欧米茄.我还try 调整迭代次数,发现迭代次数越多,问题就会在模拟后期出现,然而,当我将迭代次数设定为1000次(我的最终目标)时,所有的输出都变成了NA.
library(simstudy)
library(dirmult)
library(tidyverse)
library(dplyr)
library(readr)
library(psych)
library(GPArotation)
library(multilevel)
library(lavaan)
## creating an empty data frame for results ##
results_df <- data.frame(iteration=numeric(),
within_cluster_variance=numeric(),
inter_item_rho=numeric(),
SL_Omega_raw=numeric())
set.seed(123)
var_value <- c(0.0, 0.5, 1.0, 1.5, 2.0, 2.5)
rho_value <- c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
for(v in var_value){
for(r in rho_value){
for(i in 1:5){
# LEVEL 2 #
class.level <- defData(varname = "class_zscore", dist = "normal",
formula = 0, variance = 1, id = "Class_ID")
class.level <- defData(class.level, varname = "Student_Count", dist = "noZeroPoisson", formula = 20)
class.data <- genData(100, class.level)
# LEVEL 1 #
gen.student <- defDataAdd(varname = "student_EXTERNALIZE_score", dist = "normal",
formula = "class_zscore", variance = v)
dtClass <- genCluster(class.data, "Class_ID", numIndsVar = "Student_Count", level1ID = "Student_ID")
dtClass <- addColumns(gen.student, dtClass)
baseprobs <- matrix(c(
0.973, 0.018, .006, 0.003,
0.829, 0.095, .050, 0.026,
0.765, 0.115, .069, 0.051,
0.882, 0.068, .032, 0.018,
0.717, 0.106, .081, 0.096,
0.880, 0.062, .038, 0.020,
0.905, 0.045, .034, 0.016),
nrow = 7, byrow = TRUE)
student.items <- genOrdCat(dtClass , adjVar = "student_EXTERNALIZE_score",
baseprobs, prefix = "Item",
asFactor=FALSE, idname = "Student_ID",
corstr = "cs", rho = r)
student.items->SIM_DATA
SIM_DATA[,6:12]->ITEMS
# Single-level Continuous Omega #
# Initialize SL_Omega_values with "Convergence failed" #
SL_Omega_values <- data.frame(omega.tot = "Convergence failed")
# Attempt to calculate omega total reliability coefficients #
tryCatch({
psych::omega(ITEMS, nfactors = 1, poly = FALSE, plot = FALSE, lavaan = TRUE) -> SL_omega
SL_Omega_values <- as.data.frame(SL_omega$omega.tot)
}, error = function(e) {
# If convergence fails, assign "Convergence failed" to SL_Omega_values[1,1] #
SL_Omega_values[1,1] <- "Convergence failed"
})
results_df[i,] <- (c(i, v, r, SL_Omega_values[1,1]))
write.csv(results_df, paste0("results_df","_",v,"_",r,"_",".csv"))
results_df}}}```