Создать список информационных фреймов, отображающих значения AICc из вложенного списка моделей - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть список статистических моделей:

###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))
)

И список нулевых моделей.Они соответствуют моделям в предыдущем списке, поэтому, например, я хотел бы сравнить первый lm в «Models» с первым lm в «Models_null»:

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 ».Заранее благодарю за любую помощь в этом.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот удвоение sapply:

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

Первое sapply распространяется только на Models и Models_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)))
0 голосов
/ 07 декабря 2018

Это всего лишь приложение *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
...