从模型中提取 R2 并将它们存储到 R 中的向量中?

Cam*_*Cam 2 model r function vector dataframe

我正在 R 中构建模型,并且想提取这些模型的 R2 值并将它们存储到向量中。

下面是一个简化的数据框,显示了 6 只熊的速度与其性别、体重、年份和环境温度的关系:

speed<-c(0.5,0.1,0.3,0.4,0.9,0.2)
sex<-c(rep(c("F","M"),times=c(3,3)))
mass<-c(500,400,600,800,700,500)
year<-c(2000,2000,2001,2001,2002,2002)
temp.c<-c(0,2,3,1,3,0)
data<-data.frame(speed,sex,mass,year,temp.c)
data

  speed sex mass year temp.c
1   0.5   F  500 2000      0
2   0.1   F  400 2000      2
3   0.3   F  600 2001      3
4   0.4   M  800 2001      1
5   0.9   M  700 2002      3
6   0.2   M  500 2002      0
Run Code Online (Sandbox Code Playgroud)

这里有三个可以使用的模型:

full<-glm(formula = speed ~ sex + mass + year + temp.c, data=data,family=Gamma)
bio<-glm(formula = speed ~ sex + mass, data=data,family=Gamma)
clim<-glm(formula = speed ~ year + temp.c, data=data,family=Gamma)
Run Code Online (Sandbox Code Playgroud)

最后,我已经创建了一个函数来从模型中提取 R2:

R2<-function(x){
  psdR2<-cor(data$speed,predict(x))^2
  return(psdR2)
}
Run Code Online (Sandbox Code Playgroud)

为了自动从所有三个模型中提取 R2 并将它们存储到向量中,我尝试了以下代码,但这不起作用并且出现错误。

mods<-c(full,bio,clim)
r2.vec<-lapply(mods,R2)

Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "c('double', 'numeric')"
Run Code Online (Sandbox Code Playgroud)

我不知道此后该做什么。有什么建议么?

MrF*_*ick 6

使用

mods <- list(full, bio, clim)
Run Code Online (Sandbox Code Playgroud)

不是

mods<- c(full, bio, clim)
Run Code Online (Sandbox Code Playgroud)

您需要三个模型的列表,您不想将模型组合成单个对象。你可以看到区别

length(list(full,bio,clim))
# [1] 3
length(c(full,bio,clim))
# [1] 90
Run Code Online (Sandbox Code Playgroud)

  • 然后使用 sapply 提取 R2,这样你就得到了一个数值向量。 (2认同)