R 如何在多个物种上分别使用lapply或sapply进行GLM?

R 如何在多个物种上分别使用lapply或sapply进行GLM?,r,glm,R,Glm,我试图在我的数据集中的多个不同物种上运行GLM。目前,我一直在为每一个物种设置我的数据,并复制这些代码,结果变得一团糟。我知道必须有更好的方法来实现这一点(可能是使用lappy函数),但我不确定如何开始 我正在运行一个物种的CPUE(单位努力捕获量)模型,并使用年份、盐度、流量和降雨量作为解释变量 我的数据如下: 这是我尝试过的代码。它完成了任务,但我只是复制了这个代码,每次都在改变物种。我希望找到一种方法来简化这个过程,并稍微整理一下我的代码 fish_df$pinfishCPUE <-

我试图在我的数据集中的多个不同物种上运行GLM。目前,我一直在为每一个物种设置我的数据,并复制这些代码,结果变得一团糟。我知道必须有更好的方法来实现这一点(可能是使用lappy函数),但我不确定如何开始

我正在运行一个物种的CPUE(单位努力捕获量)模型,并使用年份、盐度、流量和降雨量作为解释变量

我的数据如下:

这是我尝试过的代码。它完成了任务,但我只是复制了这个代码,每次都在改变物种。我希望找到一种方法来简化这个过程,并稍微整理一下我的代码

fish_df$pinfishCPUE <- ifelse(fish_df$Commonname == "Pinfish", fish_all$CPUE, 0)
#create binomial column
fish_df$binom <- ifelse(fish_df$pinfishCPUE > 0, 1,0)


glm.full.bin = glm(binom~Year+Salinity+Discharge +Rainfall,data=fish_df,family=binomial)
glm.base.bin = glm(binom~Year,data=fish_df,family=binomial)

#step to simplify model and get appropriate order
glm.step.bin = step(glm.base.bin,scope=list(upper=glm.full.bin,lower=~Year),direction='forward',
                    trace=1,k=log(nrow(fish_df)))

#final model - may choose to reduce based on deviance and cutoff in above step
glm.final.bin  = glm.step.bin
print(summary(glm.final.bin))

#calculate the LSMeans for the proportion of positive trips
lsm.b.glm = emmeans(glm.final.bin,"Year",data=fish_df)
LSMeansProp = summary(lsm.b.glm)

fish|u df$pinfishCPUE|t|)
(截距)2.38530 0.72009 3.313 0.00098***
月0.10333 0.03433 3.010 0.00272**
盐度-0.13530 0.01241-10.900<2e-16***
温度0.06901 0.01434 4.811 1.9e-06***
---
签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
(高斯族的色散参数取1.679401)
零偏差:603自由度1286.4
剩余偏差:在600自由度上为1007.6
AIC:2033.2
Fisher评分迭代次数:2

我建议下一种方法是为模型创建一个函数,然后在一个列表上使用
lappy
,该列表通过变量
Commonname>对数据帧应用
split()

library(emmeans)
#Load data
fish_df <- read.csv('fish_df.csv',stringsAsFactors = F)
#Code
List <- split(fish_df,fish_df$Commonname)
#Function for models
mymodelfun <- function(x)
{
  #Create binomial column
  x$binom <- ifelse(x$pinfishCPUE > 0, 1,0)
  
  
  glm.full.bin = glm(binom~Year+Salinity+Discharge +Rainfall,data=x,family=binomial)
  glm.base.bin = glm(binom~Year,data=x,family=binomial)
  
  #step to simplify model and get appropriate order
  glm.step.bin = step(glm.base.bin,scope=list(upper=glm.full.bin,lower=~Year),direction='forward',
                      trace=1,k=log(nrow(x)))
  
  #final model - may choose to reduce based on deviance and cutoff in above step
  glm.final.bin  = glm.step.bin
  print(summary(glm.final.bin))
  
  #calculate the LSMeans for the proportion of positive trips
  lsm.b.glm = emmeans(glm.final.bin,"Year",data=x)
  LSMeansProp = summary(lsm.b.glm)
  return(LSMeansProp)
}
#Apply function
Lmods <- lapply(List,mymodelfun)
输出:

Call:
glm(formula = log.CPUE ~ Month + Salinity + Temperature, family = gaussian, 
    data = fish_B_pos)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.8927  -0.7852   0.1038   0.8974   3.5887  

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  2.38530    0.72009   3.313  0.00098 ***
Month        0.10333    0.03433   3.010  0.00272 ** 
Salinity    -0.13530    0.01241 -10.900  < 2e-16 ***
Temperature  0.06901    0.01434   4.811  1.9e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 1.679401)

    Null deviance: 1286.4  on 603  degrees of freedom
Residual deviance: 1007.6  on 600  degrees of freedom
AIC: 2033.2

Number of Fisher Scoring iterations: 2
 Year emmean    SE  df asymp.LCL asymp.UCL
 2009  -22.6 48196 Inf    -94485     94440

Results are given on the logit (not the response) scale. 
Confidence level used: 0.95 

如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。数据应包含在问题中,而不是链接到外部站点。也许可以弄清楚循环中需要更改的内容,并弄清楚每次迭代中需要存储的内容。
 Year emmean    SE  df asymp.LCL asymp.UCL
 2009  -22.6 48196 Inf    -94485     94440

Results are given on the logit (not the response) scale. 
Confidence level used: 0.95