我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}}}```

推荐答案

我认为问题是你的tryCatch()没有以正确的方式保存你想要的值. 您需要SL_Omega_values作为tryCatch()的输出,而不是试图在函数中设置该值. 试试这个:

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 #
      SL_Omega_values <- tryCatch({
        psych::omega(ITEMS, nfactors = 1, poly = FALSE, plot = FALSE, lavaan = TRUE) -> SL_omega
        
        as.data.frame(SL_omega$omega.tot)
      }, error = function(e) {
        # If convergence fails, assign "Convergence failed" to 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}}}

R相关问答推荐

使用对管道内单元格的引用生成新变量

R Highcharts与两个位置关联的注释

如何根据组大小应用条件过滤?

用derrr在R中查找组间的重复项

如何写一个R函数来旋转最后n分钟?

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

将数字转换为分钟和秒

如何删除仅在数据集顶部和底部包含零的行

R中边际效应包中Logistic回归的交互作用风险比

当我添加美学时,geom_point未对齐

R如何计算现有行的总和以添加新的数据行

R -使用矩阵reshape 列表

R+reprex:在呈现R标记文件时创建可重现的示例

减go R中列表的所有唯一元素对

在散点图中使用geom_point放置线图例

如何显示准确的p值而不是<;0.001*?

在r中整理图例和堆叠图的问题

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

如何使投篮在R中保持一致

具有自定义仓位限制和计数的GGPLATE直方图