使用dlply分析gam模型中的多个因变量(不同物种相同的预测变量)

时间:2014-05-01 19:14:41

标签: r iteration gam

我仍然处于R的学习曲线(以及本论坛的新篇章),并且一直试图循环一个gam模型,在那里我试图评估不同的响应(因变量 - 在这种情况下是鱼类)到环境预测因子。所以基本上我想在循环中重新创建以下内容:

G1< -GAm(VAR1〜S(X1)+ S(×2))

g2< -gam(var2~s(x1)+ s(x2))

G3< -GAm(VAR2〜S(X1)+ S(×2))

我的数据框架由不同列中每个物种的丰富度组成,然后是单独列中的环境预测变量。我在本论坛中遵循了一些建议,使用melt和dlply按物种迭代gam模型。我使用了以下代码:

melt.x<-melt(FullMatrix, id=c("PLAND_50","FragIndex_50"),measure.var=c("CALLI_SPP","CARIDEA",  "EUC_ARG","FAR_DUO","HAE_SCI","LAG_RHO","LUC_PAR","LUT_GRI","OPS_BET","SPH_BAR","SYN_SPP"), variable.name="Nekton", value.name="Abundance") 

。上面的代码创建了一个data.frame,每个物种观察都有一行

attach(melt.x)

gams_50<-dlply(melt.x, .var=c("Nekton"), .fun=function(x){
gam(scale(Abundance)~s(PLAND_50,bs="cr")+s(FragIndex_50,bs="cr")+te(PLAND_50,FragIndex_50), gamma=1.4)
})

lapply(gams_50, summary)

代码运行没有错误,但是,当我检查结果时,我注意到整个物种的结果相似(即,相同的调整R,变量p值,GCV分数等)。有人有想法如何运行多个gams?或找出错误来源?

欢迎并赞赏所有想法!希望我不是模糊的。如果您需要任何进一步的信息,请告诉我。

Best,Rolo

1 个答案:

答案 0 :(得分:0)

我不确定为什么它不起作用。但我为您提供了两种可能的解决方案,其中包含我创建的类似数据框架。可能有更优雅的解决方案,但这些工作:

library (plyr) 
library(mgcv)

## Creation of an artificial data frame

sp_a  <- rnorm (100, mean = 3, sd = 0.9)

sp_b  <- rnorm (100, mean = 7, sd = 2.3)


var_env_1 <- rnorm (100, mean = 1, sd = 0.3)

var_env_2 <- rnorm (100, mean = 5, sd = 1.6)


data <- data.frame (sp_a, sp_b, var_env_1, var_env_2  ) 

## solution 1

data_2 <- melt.data.frame (data, measure.vars = c("sp_a", "sp_b"), variable_name = "Species") 

dlply ( data_2, .(Species), function (x) { summary (gam(value ~ s (var_env_1 ) + s (var_env_2), data = x  ) ) }  )

## solution 2

## Loop

for (i in names (data)[1:2] ) {

  assign ( paste ("m",i,sep = "_") , gam ( get (i) ~ s (var_env_1 ) + s (var_env_2 ) , data = data))

  print( summary ( get (paste ("m",i,sep = "_") ) ) )

}

# The last print is equivalent to do this:

summary(m_sp_a)

summary(m_sp_b)