2

我有一个统计模型列表:

###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 分数的数据框列表,其中 2 列用于 'full' 和 'null。提前感谢您对此提供的任何帮助。

4

2 回答 2

2

这是一个双重sapply

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

第一个sapply只是过去ModelsModels_null。然后自然而然地对于这两个列表中的每一个我们要再次应用sapply,我们将在哪里使用每个模型aicc。这正是@Rui Barradas 的解决方案。

如果需要,之后当然可以将结果转换为数据框。


至于获取其元素是上述矩阵的行的列表,以下三个中的任何一个都可以:

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)))
于 2018-12-07T16:47:41.890 回答
1

这只是*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
于 2018-12-07T16:44:11.070 回答