代码之家  ›  专栏  ›  技术社区  ›  James White

从嵌套的模型列表中创建显示AICC值的数据帧列表

  •  2
  • James White  · 技术社区  · 6 年前

    我有一个统计模型列表:

    ###Data import
    Responses <- as.data.frame(matrix(sample(0:10, 1*100, replace=TRUE), ncol=2))
    colnames(Responses) <- c("A","B")
    Explanatories <- as.data.frame(matrix(sample(20:30, 1*100, replace=TRUE), ncol=2))
    colnames(Explanatories) <- c("x","y")
    
    ###Create models
    Models <- list(
    lm(Responses$A ~ Explanatories$x),
    lm(Responses$B ~ log10(Explanatories$x)),
    lm(Responses$B ~ exp(Explanatories$y))
    )
    

    以及一个空模型列表。这些对应于上一列表中的模型,因此,例如,我想将“models”中的第一个lm与“models_null”中的第一个lm进行比较:

    Models_null <- list(
    lm(Responses$A ~ 1),
    lm(Responses$B ~ 1),
    lm(Responses$B ~ 1)
    )
    
    All_models <- list(Models,Models_null)
    names(All_models)<-c("full","res")
    

    我想使用以下公式计算每个模型的AICC得分:

    aicc<-function(x) AIC(x)+((2*length(coef(x))*(length(coef(x))+1))/(length(resid(x))-length(coef(x))-1))
    

    我需要根据AICC分数如何比较每个完整模型和空模型来做一些计算。 所以我需要的是一个显示每对模型的AICC得分的数据帧列表,其中“full”和“null”有两列 . 提前感谢您对此提供的帮助。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rui Barradas    6 年前

    这只是 *apply 功能。我选择了 sapply 因为如果可能,它会返回一个向量。

    Full <- sapply(Models, aicc)
    Null <- sapply(Models_null, aicc)
    df_aicc <- data.frame(Full, Null)
    
    df_aicc
    #      Full     Null
    #1 269.7858 268.5274
    #2 254.6533 253.0980
    #3 254.8408 253.0980
    

    为了将这个数据帧分割成一个df列表,每个df使用一行, split . 按行名称,在R中必须是唯一的。

    list_aicc <- split(df_aicc, row.names(df_aicc))
    list_aicc
    #$`1`
    #      Full     Null
    #1 269.7858 268.5274
    #
    #$`2`
    #      Full    Null
    #2 254.6533 253.098
    #
    #$`3`
    #      Full    Null
    #3 254.8408 253.098
    
        2
  •  2
  •   Julius Vainora    6 年前

    这是双人房 sapply :

    sapply(All_models, sapply, aicc)
    #          full      res
    # [1,] 267.4959 266.0534
    # [2,] 251.9809 251.9127
    # [3,] 253.5760 251.9127
    

    第一个 斯普林特 只会过去 Models Models_null . 然后自然地,对于这两个列表中的每一个,我们再次希望应用 斯普林特 ,我们将在哪里使用每种型号 aicc . 这正是@rui baradas的解决方案。

    当然,如果需要的话,结果可以转换成数据帧。


    相反,要得到一个元素为上述矩阵行的列表,可以使用以下三种方法之一:

    lapply(seq_along(Models), function(i) 
      data.frame(full = aicc(Models[[i]]), null = aicc(Models_null[[i]])))
    
    Map(data.frame, full = lapply(Models, aicc), null = lapply(Models_null, aicc))
    
    do.call(Map, c(data.frame, lapply(All_models, sapply, aicc)))