将相同的混合模型拟合到 R 中的多个数据帧或子集的快速方法?
quick way to fit the same mixed model to multiple dataframes or subsets in R?
我有包含多种作物生长数据的数据集。实验处理是在作物内进行的(即我不是在作物之间进行比较)并且具有随机块设计,随着时间的推移重复测量。我想 运行 在 R 中的每个不同作物上使用相同的混合模型:
model<-lmer(response~treatment*time+(1|block), data=data)
我的数据集包含 20 个作物,我想提取所有固定的截距和系数,所以 运行 分别对每个作物的模型很烦人。不知何故,我从其他一些帖子中得到的印象是,给定以下公式,lmList 将 运行 对每种作物形成一个单独但通用的混合模型。然而现在更详细地检查了帮助页面和输出,我认为它只是做一个固定效应线性模型 (lm)。
model_set <- lme4::lmList(response~treatment*time+(1|block)|crop,data=data)
我找不到任何关于在多个数据集上设置循环以 运行 相同的混合效应模型和提取系数的好帖子,或者是否有任何现有的功能。如果有人可以推荐一个快速简单的解决方案,那就太好了。
作为示例数据集,我建议使用 lme4 sleepstudy 数据,但让我们做一个假的 'group' 因子来模仿我的 'crop' 因子:
library(lme4)
data(sleepstudy)
library(car)
sleepstudy$group<-recode(sleepstudy$Subject,
" c('308','309','310','330','331','332','333','334') = 'group1';
c('335','337','349','350','351','352','369','370','371','372') = 'group2'")
model<-lmer(Reaction~Days+(1|Subject), data=sleepstudy)
如何在每个组上分别自动化 运行 构建同一模型,然后提取截距和系数?
非常感谢您提出任何建议。
今天我偶然发现了'split'函数,这意味着我可以回答我自己的问题。 split 函数根据指定因子的水平将数据帧子集划分为数据帧列表。然后可以在列表中的每个数据帧上设置一个简单的循环 运行 相同的模型。
list_df <- split(sleepstudy, sleepstudy$group) #split example dataset by group factor
results_df <- as.data.frame(matrix(ncol=2,nrow=length(list_df))) # make an empty dataframe
colnames(results_df)<-c("intercept","Days") #give the dataframe column names
for (i in 1:length(list_df)){ #run a loop over the dataframes in the list
mod<-lmer(Reaction~Days+(1|Subject),data=list_df[[i]]) #mixed model
results_df[i,]<-fixef(mod) #extract coefficients to dataframe
rownames(results_df)[i]<-names(list_df)[i] #assign rowname to results from data used
}
我有包含多种作物生长数据的数据集。实验处理是在作物内进行的(即我不是在作物之间进行比较)并且具有随机块设计,随着时间的推移重复测量。我想 运行 在 R 中的每个不同作物上使用相同的混合模型:
model<-lmer(response~treatment*time+(1|block), data=data)
我的数据集包含 20 个作物,我想提取所有固定的截距和系数,所以 运行 分别对每个作物的模型很烦人。不知何故,我从其他一些帖子中得到的印象是,给定以下公式,lmList 将 运行 对每种作物形成一个单独但通用的混合模型。然而现在更详细地检查了帮助页面和输出,我认为它只是做一个固定效应线性模型 (lm)。
model_set <- lme4::lmList(response~treatment*time+(1|block)|crop,data=data)
我找不到任何关于在多个数据集上设置循环以 运行 相同的混合效应模型和提取系数的好帖子,或者是否有任何现有的功能。如果有人可以推荐一个快速简单的解决方案,那就太好了。
作为示例数据集,我建议使用 lme4 sleepstudy 数据,但让我们做一个假的 'group' 因子来模仿我的 'crop' 因子:
library(lme4)
data(sleepstudy)
library(car)
sleepstudy$group<-recode(sleepstudy$Subject,
" c('308','309','310','330','331','332','333','334') = 'group1';
c('335','337','349','350','351','352','369','370','371','372') = 'group2'")
model<-lmer(Reaction~Days+(1|Subject), data=sleepstudy)
如何在每个组上分别自动化 运行 构建同一模型,然后提取截距和系数?
非常感谢您提出任何建议。
今天我偶然发现了'split'函数,这意味着我可以回答我自己的问题。 split 函数根据指定因子的水平将数据帧子集划分为数据帧列表。然后可以在列表中的每个数据帧上设置一个简单的循环 运行 相同的模型。
list_df <- split(sleepstudy, sleepstudy$group) #split example dataset by group factor
results_df <- as.data.frame(matrix(ncol=2,nrow=length(list_df))) # make an empty dataframe
colnames(results_df)<-c("intercept","Days") #give the dataframe column names
for (i in 1:length(list_df)){ #run a loop over the dataframes in the list
mod<-lmer(Reaction~Days+(1|Subject),data=list_df[[i]]) #mixed model
results_df[i,]<-fixef(mod) #extract coefficients to dataframe
rownames(results_df)[i]<-names(list_df)[i] #assign rowname to results from data used
}