基于AICc

时间:2018-12-11 17:40:26

标签: r glmulti

我有一个相当简单的问题。我尝试根据校正的Akaike信息准则(= AICc)从实验设计中自动进行线性模型选择。对于我而言,重要的是使用AICc而不是AIC,否则由于样本数量少,模型选择会趋于过度拟合。

最后,我想简化模型。

我已经与glmulti合作很多,以实现自己的目标。不幸的是,如果我要考虑主要效果,交互作用和二次效果,很难使该功能运行。

我将代码和示例数据提供给您。

首先,具有5个因素(A:E)和两个响应(y和y2)的设计的示例数据。我想估算主要效果,相互作用(仅在主要效果之间)和二次效果。

#topic:   DoE analysis
#author:  xxxx


#####################################################################################################################################
####preparation######################################################################################################################
#####################################################################################################################################


#packages
library(glmulti)
library(tidyverse)


#####################################################################################################################################
####options##########################################################################################################################
#####################################################################################################################################


#ranges##############################################################################################################################

#range for factors
rf <- 1:5
#range for responses
y <- 6:7


#####################################################################################################################################
####load data########################################################################################################################
#####################################################################################################################################
df <- data.frame(
                 A = c(-1L, -1L, -1L, 1L, -1L, -1L, 1L, 1L, 0L, 1L, -1L, 0L, 1L, -1L,
                       -1L, 1L, -1L, 1L, 1L, -1L, -1L, -1L, 1L, 0L, 0L, -1L,
                       0L, 1L, 1L, 1L),
                 B = c(1L, -1L, 1L, -1L, -1L, 0L, 0L, -1L, 0L, -1L, 0L, -1L, 1L, 1L,
                       1L, -1L, 1L, 1L, 1L, 1L, -1L, -1L, -1L, 1L, 1L, -1L,
                       -1L, 1L, 0L, 1L),
                 C = c(-1L, 0L, 1L, 1L, 1L, -1L, 1L, -1L, -1L, -1L, 1L, 0L, 0L, -1L,
                       -1L, -1L, 1L, -1L, 1L, 0L, -1L, 1L, 1L, -1L, 1L, -1L,
                       1L, 1L, 0L, -1L),
                 D = c(1L, 0L, 1L, -1L, 1L, 1L, 0L, -1L, -1L, 1L, -1L, -1L, -1L, -1L,
                       0L, 0L, -1L, -1L, -1L, 1L, -1L, -1L, 1L, 1L, 0L, 1L, 1L,
                       1L, 1L, 1L),
                 E = c(0L, -1L, -1L, 1L, 1L, 1L, 1L, -1L, -1L, 1L, 0L, 1L, 0L, -1L,
                       1L, 0L, 1L, 1L, -1L, 1L, 1L, -1L, -1L, 1L, -1L, -1L, 0L,
                       1L, -1L, -1L),
                 y = c(97.73, 106.6, 102.5, 100.2, 119.6, 105.9, 103.1, 112.1, 100.7,
                       109.2, 104.9, 97.78, 94.27, 96.65, 102, 109.9, 111.8,
                       87.58, 105.5, 103.8, 92.11, 105.2, 141.5, 98.02, 107, 113,
                       127.1, 96.26, 114.3, 93.15),
                y2 = c(114.9, 116.2, 114.9, 118.3, 113.5, 115.3, 116.9, 116.6, 115.9,
                       118.3, 114.8, 114.9, 116.2, 114.5, 115.5, 116.6, 114.3,
                       116.6, 116.2, 116.1, 114.9, 115.5, 119, 116.2, 115.7,
                       117.3, 115.4, 117.2, 115.7, 118.5)
      )

然后,我提取列名称并为模型公式创建向量

#####################################################################################################################################
####data preparation#################################################################################################################
#####################################################################################################################################


### Define which columns are factors and which are responses

#extract column names
namesFactors <- colnames(df)[rf]
namesResponses <- colnames(df)[y]

#extract values
factors <- as.matrix(df[,namesFactors])
responses <- df[,namesResponses]

#create formula
mainFactors <- namesFactors
quadFactors <- paste0("I(", namesFactors, "^2)")

quadquadInteraction <- paste0(combn(quadFactors,2)[1,], ":", combn(quadFactors,2)[2,]) 
mainquadInteraction <- paste0(expand.grid(mainFactors, quadFactors)[,2], ":", expand.grid(mainFactors, quadFactors)[,1])

excludeFactors <- c(quadquadInteraction, mainquadInteraction)

最后,我尝试根据AICc查找简化模型:

#reduce model
redModel <- vector("list",length(namesResponses))

for(i in 1:length(namesResponses)){
  redModel[[i]] <- glmulti(y = namesResponses[i], c(mainFactors, quadFactors), data = df[c(namesFactors, namesResponses[i])], crit="aicc", marginality=TRUE, level = 2, fitfunction = "lm", method = "g", deltaM = 10, deltaB = 0, conseq = 3, exclude = excludeFactors)
}

这最后一部分有点复杂。 Glmulti仅允许具有主要效果(级别= 1)或具有主要效果和交互作用(级别= 2)的模型。要包括二次项,我必须将它们添加为I(Factor ^ 2)。这样,它们将被视为主要效果。 但是,glmulti还将寻找二次交互以及二次项和主效应之间的交互。但是我对那些效果不感兴趣! 这就是为什么我定义一个称为 exludeFactors 的向量的原因,在该向量中我考虑了那些不需要的术语。不幸的是,glmulti只允许排除其中一些术语,但不允许全部,我也不知道为什么!

如果有人可以帮助我运行代码,我将非常感激。只要信息标准(= IC)是AICc而不是AIC,我也可以灵活地使用任何其他包和函数来代替glmulti。

如果有人知道如何基于r-base lm()函数简化一个完整的线性模型,我们可以使用以下代码来拟合一个完整的模型:

#interactions
inter <- TRUE
quad <- TRUE

#create formula
formula <- vector("list",length(namesResponses))

for(i in 1:length(namesResponses)){
  formula[[i]] <-  paste(namesResponses[i], "~") %>%  #reponse part
    paste(".") %>% #main effects
    ifelse(inter == TRUE, paste(.," + (.)^2"), .) %>% #interactions
    ifelse(quad == TRUE, paste(.,paste0(" + I(", namesFactors, "^2)", collapse="")), .) %>% #quadratic terms
    as.formula
}

#create lm models based on 1t idea
fullModel <- vector("list",length(namesResponses))

for(i in 1:length(namesResponses)){
  fullModel[[i]] <- lm(data = df[c(namesFactors,namesResponses[i])], formula[[i]])
}

0 个答案:

没有答案