首页 文章

在poLCA R包中找到最佳的LCA模型

提问于
浏览
1

我正在使用PoLCA R软件包进行LCA分析,但分析结果自三天后才开始(它还没有找到最好的模型),偶尔会出现以下错误:“警告:迭代完成,最大可能没有找到” . 所以我在35个潜班上取消了这个过程 . 我正在分析16个变量(所有这些变量都是分类的)和36036行数据 . 当我在Boruta软件包中测试16个变量的变量重要性时,所有16个变量都很重要,因此我在使用poLCA的LCA分析中使用了所有16个变量 . 我应该走哪条路?我是否应该使用其他聚类方法(如k-modes)来聚类此数据集中的分类变量?我使用500次迭代的参数和nrep = 10模型估计数 . 我使用R脚本在LCA中找到最佳模型,其中一个输出如下:

for(i in 2:50){
    lc <- poLCA(f, data, nclass=i, maxiter=500, 
                tol=1e-5, na.rm=FALSE,  
                nrep=10, verbose=TRUE, calc.se=TRUE)
    if(lc$bic < min_bic){
        min_bic <- lc$bic
        LCA_best_model<-lc
    }
}

================================================= ========适合35个潜在课程:==================================== =====================观测次数:36036估计参数数:2029剩余自由度:34007最大对数似然:-482547.1 AIC(35): 969152.2 BIC(35):986383 G ^ 2(35):233626.8(似然比/偏差统计量)X ^ 2(35):906572555(卡方拟合度)警告:迭代完成,最大似然没有找到

1 回答

  • 0

    您正在使用的脚本按顺序测试从2到50个类的每个模型,并保持具有最低BIC的模型 . BIC不是选择“最佳”模型的唯一或最佳方式,但足够公平 .

    问题是,您正在估计很多参数,尤其是在最后的步骤中 . 您适合的课程越多,该过程就越耗时 . 此外,在这种情况下,收敛问题是可以预期的,因为你适合这么多的课程 . 这就是错误消息报告的内容,它找不到具有35个类的模型的最大可能性 .

    我不知道你要解决什么问题,但是LCA中超过10个类的模型是不寻常的 . 您可以通过LCA尽可能地降低数据的复杂性 . 如果你 NEED 适合具有多个10-类的模型:

    • 逐个适合它们,因此RAM消耗不会成为问题 .

    • 增加了调用中的 nrep= 参数,因此您模型未偶然找到最大可能性的概率 - 随机初始数 - 减少 . 还会增加计算时间 .

    或者,您可以减少并行运行模型的计算时间 . 几乎每台现代PC都有2个或更多核心 . 下一个块中的函数 acl() 使用 foreach()%dopar% 执行此操作,因此与OS无关 .

    library(poLCA)
    library(foreach)
    library(doParallel)
    registerDoParallel(cores=2) #as many physical cores as available.
    
    acl <- function(datos,   #a data.frame with your data 
                    k,       #the maximum number of classes to fit
                    formula) {  
      foreach(i=1:k, .packages="poLCA") %dopar% poLCA(formula, datos, nclass=i
      )
    }
    

    acm() 返回模型列表,稍后可以选择"the best" . 下一个函数将从列表中检索intrest的数量,并创建一个格式良好的data.frame,其中包含有用的信息以选择正确数量的类 .

    comparar_clases_acl <- function(modelo) {
      entropy<-function (p) sum(-p*log(p)) #to asses the quality of classification
        tabla_LCA <- data.frame(Modelo=0, BIC=0, Lik_ratio=0, Entropia=0, MenorClase=0)   #empty data.frame to prealocate memory. 
    for(i in 1:length(modelo)){
      tabla_LCA [i,1] <- paste("Modelo", i)
      tabla_LCA [i,2] <- modelo[[i]]$bic
      tabla_LCA [i,3] <- modelo[[i]]$Gsq
      error_prior <- entropy(modelo[[i]]$P)
      error_post <- mean(apply(modelo[[i]]$posterior,1, entropy),na.rm = TRUE)
      tabla_LCA [i,4]<-round(((error_prior-error_post) / error_prior),3)
      tabla_LCA [i,5] <- min(modelo[[i]]$P)*100
      }
    return(tabla_LCA)
    }
    

    它只需要一个参数:一个具有LCA模型列表的对象,正是 acl() 返回的内容 .

    这种并行方法应该减少计算时间 . 仍然有50个课程很多,你可能在50课之前获得最小的BIC方式 . 请记住,BIC惩罚模型随着估计参数的数量增加,帮助您找到模型中额外类别的收益递减点 .

相关问题