在R中的多个数据帧上运行元分析

在R中的多个数据帧上运行元分析,r,loops,data-analysis,metafor,R,Loops,Data Analysis,Metafor,我是R的初学者。我需要您的帮助来自动化这些分析,并获得结果的摘要输出 我有4个不同的数据帧(如下所示),在阈值列中有相同的标题和值: Set Threshold R2 P Coefficient Standard.Error Num_SNP Base 0.0001 0.000233304 0.66047 0.0332613 0.0757204 47 Base 0.001 0.000387268

我是R的初学者。我需要您的帮助来自动化这些分析,并获得结果的摘要输出

我有4个不同的数据帧(如下所示),在阈值列中有相同的标题和值:

   Set   Threshold  R2           P          Coefficient  Standard.Error  Num_SNP
Base  0.0001     0.000233304  0.66047    0.0332613    0.0757204       47
Base  0.001      0.000387268  0.571772   -0.0438782   0.0775996       475
Base  0.05       0.00302399   0.114364   0.129474     0.082004        14164
Base  0.1        0.00252797   0.14897    0.117391     0.0813418       24616
Base  0.2        0.00481908   0.0465384  0.163571     0.0821767       41524
Base  0.3        0.00514761   0.0398082  0.170058     0.0827237       55307
Base  0.4        0.00699506   0.0166685  0.200571     0.083783        66943
Base  0.5        0.00634181   0.0226301  0.192314     0.0843623       76785
对于阈值列中的每个匹配值,我想使用metafor包在R中对4个数据帧上的相应效应大小(在系数列中)和标准误差进行元分析

使用metafor包:

rma.uni(yi=c(Coefficient_1,Coefficient_2,Coefficient_3,Coefficient_4),sei=c(Standard.Error_1,Standard.Error_2,Standard.Error_3,Standard.Error_4), measure="GEN", method='FE',intercept=T,weights=c(sample_size1,sample_size2,sample_size3,sample_size4))

如何使分析自动化,并获得每个阈值的结果摘要数据框?

您好,这应该让您开始。基本上,您可以循环所有阈值 将所有4个数据帧中与每个阈值匹配的行提取到一个新的数据帧中,并运行元分析

library(metafor)
# Make some fake data resembling your own
df1 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df2 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df3 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df4 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))

Thresholds = unique(df1$Threshold)

Results <- NULL
for(i in 1:length(Thresholds)){
  idf = rbind(df1[df1$Threshold==Thresholds[i],],
              df2[df2$Threshold==Thresholds[i],],
              df3[df3$Threshold==Thresholds[i],],
              df4[df4$Threshold==Thresholds[i],])
  i.meta <- rma.uni(yi=idf$Coefficient,sei=idf$Standard.Error, measure="GEN", method='FE',intercept=T,
                    weights=idf$Num_SNP)
  Results <- rbind(Results, c(Threshold=Thresholds[i],beta=i.meta$beta,se=i.meta$se,
                              zval=i.meta$zval,pval=i.meta$pval,ci.lb=i.meta$ci.lb,
                              ci.ub=i.meta$ci.ub,QEp=i.meta$QEp))
}
Results <- data.frame(Results)
Results

嗨,这应该让你开始了。基本上,您可以循环所有阈值 将所有4个数据帧中与每个阈值匹配的行提取到一个新的数据帧中,并运行元分析

library(metafor)
# Make some fake data resembling your own
df1 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df2 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df3 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))
df4 = data.frame(Set=rep("Base",8), Threshold=c(0.0001,0.001,0.05,seq(0.1,0.5,0.1)),
                 R2=runif(8,0.001,0.005),P=runif(8,0.001,1),Coefficient=runif(8,-0.1,0.2),
                 Standard.Error=runif(8,0.07,0.08),Num_SNP=sample(1:1000,8))

Thresholds = unique(df1$Threshold)

Results <- NULL
for(i in 1:length(Thresholds)){
  idf = rbind(df1[df1$Threshold==Thresholds[i],],
              df2[df2$Threshold==Thresholds[i],],
              df3[df3$Threshold==Thresholds[i],],
              df4[df4$Threshold==Thresholds[i],])
  i.meta <- rma.uni(yi=idf$Coefficient,sei=idf$Standard.Error, measure="GEN", method='FE',intercept=T,
                    weights=idf$Num_SNP)
  Results <- rbind(Results, c(Threshold=Thresholds[i],beta=i.meta$beta,se=i.meta$se,
                              zval=i.meta$zval,pval=i.meta$pval,ci.lb=i.meta$ci.lb,
                              ci.ub=i.meta$ci.ub,QEp=i.meta$QEp))
}
Results <- data.frame(Results)
Results

非常感谢你的帮助。我想象在脚本{idf=rbind(df1[df2$Threshold==Thresholds[I],]}的这一部分中,应该有df1代替df2,对吗?但是,我如何获得所有阈值的输出数据帧,在每一行显示输入data.frames的阈值,以及元分析的相应结果(即,在每一行:Threshold、beta、se、zval、pval、ci.lb、ci.ub、QEp)?再次感谢!您是正确的,这是一个输入错误。我将修复上面的代码,非常感谢您的大力帮助。我想在脚本的这一部分{idf=rbind(df1[df2$Threshold==Thresholds[I],]}应该有df1代替df2,对吗?但是,我如何才能获得所有阈值的输出数据帧,在每行显示输入data.frames的阈值,以及元分析的相应结果(即每行:阈值、beta、se、zval、pval、ci.lb、ci.ub、QEp)再次感谢!你是对的,这是一个打字错误。我将修复上面的代码