我有一个相当简单的问题。我尝试根据校正的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]])
}