Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从混合模型中移除所有固定效果_R_Lme4_Mixed Models_Lmer - Fatal编程技术网

R 从混合模型中移除所有固定效果

R 从混合模型中移除所有固定效果,r,lme4,mixed-models,lmer,R,Lme4,Mixed Models,Lmer,我正在尝试使用lmer自动识别和删除混合模型语句中的固定效果。简单地说,我的方法是使用fixef获取固定效果名称,然后使用update从model语句中删除这些名称。我遇到了一些困难 首先,如果固定因子不是连续的,则fixef返回附加有治疗水平的变量名称(例如levels(variable1)=c(“A”、“B”、“c”)将返回variable1B和variable1C)。我试图通过部分匹配来解决这个问题,但我相信它不会在所有情况下都成功(见下文) 其次,如果存在交互,则部分匹配将分离并仅标识第

我正在尝试使用
lmer
自动识别和删除混合模型语句中的固定效果。简单地说,我的方法是使用
fixef
获取固定效果名称,然后使用
update
从model语句中删除这些名称。我遇到了一些困难

首先,如果固定因子不是连续的,则
fixef
返回附加有治疗水平的变量名称(例如
levels(variable1)=c(“A”、“B”、“c”)
将返回
variable1B
variable1C
)。我试图通过部分匹配来解决这个问题,但我相信它不会在所有情况下都成功(见下文)

其次,如果存在交互,则部分匹配将分离并仅标识第一个项(例如,仅从
variable1:variable
返回
variable1
)。我不知道该怎么解决这个问题

下面是一些示例代码:

#Create example data
set.seed(9)
data=data.frame(y=rnorm(100,5,10),y.binom=rbinom(100,1,0.5),
                y.poisson=rpois(100,5),fixed1=rnorm(100,20,100),
                fixed2=c("Treatment1","Treatment2"),covar=rnorm(100,20,100),
                rand1=LETTERS[1:2],
                rand2=c(rep("W",25),rep("X",25),rep("Y",25),rep("Z",25)))

library(lme4)

#Fit generalized linear mixed effects model
mod=glmer(y.poisson~fixed1*fixed2+covar+(1|rand2/rand1),family="poisson",data)
#Pull out names of fixed effects
fixef.names=do.call(rbind,lapply(1:length(names(fixef(mod))[-1]),function(j) {
  d=colnames(mod@frame)[pmatch(colnames(mod@frame),names(fixef(mod))[-1][j])>0]
  d[!is.na(d)] } ) )[,1]
# Generate null model (intercept and random effects only, no fixed effects)
null.mod=update(mod,paste(".~.-",paste(fixef.names,collapse="-"),sep=""))
感谢您的帮助

1)仅针对单一效果:gsub是否会将名称“variable”去掉,然后将处理方法与用于拟合的数据框中的某个内容匹配,从而获得正确的名称以提取/添加到update语句中

2) 对于交互,可以尝试使用:first进行strsplit。然后检查输出的长度。如果>1,则匹配两个变量,并根据需要删除/添加更新。它不会像一个函数那样优雅,但它应该可以工作


3) 为什么不直接使用glmulti库呢?它已经以自动化的方式实现了这一点。如果您不想要所有的fit模型,只需提取您想要的模型,然后继续。但是它的对象结构中会存储所有的fit对象。

lme4中有一个内置的
findbars()
函数,它可以让您获得大部分的功能。您仍然需要对结果进行分解(它们作为
language
对象返回);用括号保护它们;然后把它们放回公式里。但这似乎是可行的:

parens <- function(x) paste0("(",x,")")
onlyBars <- function(form) reformulate(sapply(findbars(form),
                                              function(x)  parens(deparse(x))),
                                              response=".")
onlyBars(formula(mod))
## . ~ (1 | rand1:rand2) + (1 | rand2)
update(mod,onlyBars(formula(mod)))

parens啊,我正在尝试对任何模型进行自动化,因此对“variable”使用
gsub
,对于任何不是因子名称的模型,这种方法都会失败
glmulti
可能会起作用,但我仍然必须选择正确的空模型(例如,一个具有所有随机效应,没有固定效应),因此我认为我回到了原点。对于glmulti,这只是一个过滤问题。你应该能够用你想要的随机效果将这些模型子集,然后从那里开始(在ye olde biodepth分析中做了类似的事情)。至于gsub,您可以先grep变量。如果它在那里,就做因子的事情。如果没有,那么你已经有了一个变量名,所以不用担心。啊哈,非常聪明,采取相反的方法,隔离随机因素。不知道
findbars
。谢谢你,本!