楼主: sssyunsheng
3276 8

[程序分享] 自然杂志用R脚本分析气候变暖数据与熊蜂分布数据 [推广有奖]

  • 2关注
  • 47粉丝

博士生

51%

还不是VIP/贵宾

-

威望
0
论坛币
24 个
通用积分
5.0108
学术水平
47 点
热心指数
49 点
信用等级
43 点
经验
5133 点
帖子
203
精华
0
在线时间
301 小时
注册时间
2012-2-21
最后登录
2024-2-22

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
  1. ## ---------------------------------------------------------------
  2. ## 标明题目(CLIMATE CHANGE IMPACTS ON BUMBLEBEES CONVERGE ACROSS CONTINENTS)
  3. ## ---------------------------------------------------------------
  4. ##
  5. ##
  6. ## 指明了R平台
  7. ##
  8. ##
  9. ## 指明了作者
  10. ## 指明了问题联系人
  11. ##
  12. ##
  13. ##
  14. ## 撰写运行说明
  15. ##
  16. ## ---------------------------------------------------------------
  17. ## 数据探索阶段及预先设置
  18. ## ---------------------------------------------------------------
  19. ## 指明文档需要的数据及存放位置

  20. rawDataPath <- "G:/自媒体/2015-07-15/DryadSubmission/"
  21. ##
  22. ##
  23. ## 设定维度和温度的最大值个数,之所以取多个最大值,是因为论文中使用的最大值是
  24. ## 5个观测最大值的均值。
  25. ##
  26. numExtremeObs <- 5
  27. ##
  28. ## 移除个别物种
  29. ## 数据探索阶段移除个别特殊类型的物种是十分必要的
  30. ## 通过正则表达式查找需要移除的物种,多个物种之间用"|"隔开形如 "affinis|occidentalis".
  31. ## 一些探索性分析:
  32. ## 1.移除具有异常值的物种
  33. ## removeSpecies <- "sporadicus|borealis|pomorum|norvegicus|frigidus|bohemicus|cryptarum|affinis|flavifrons"
  34. ## 2.移除生活在墨西哥的品种
  35. # removeSpecies <- "pensylvanicus|huntii|fervidus|nevadensis|rufocinctus"
  36. ## 3.移除种群弱化受其他因素影响的品种
  37. ## removeSpecies <- "affinis|occidentalis"
  38. removeSpecies <- FALSE #正式发表的文章中可以不用移除物种
  39. ## 设置绘图颜色
  40. ## 说明颜色将被在那些配件中使用,这里颜色用于区分欧洲和北美及置信区间带
  41. plotCol <- c("#d01c8b", "#4dac26")#点线颜色用于区分欧美
  42. ciCol <- c("#f1b6da40", "#b8e18640")#设置置信区间颜色用于区分欧美
  43. ## 设置图片保存格式,如果绘图窗口出现图片,就保存到工作目录
  44. plotType <- "JPEG"
  45. ##
  46. ##
  47. ## ---------------------------------------------------------------
  48. ## 生产文章所用的图表及分析模型
  49. ## ---------------------------------------------------------------
  50. ##
  51. ## 程序保证上一步获得R运行结果保存在工作目录下,及上一步的记过要保存在内存中,
  52. ## 中途关闭或上一步无果可能导致下一步报错终止
  53. ##
  54. ##
  55. ##
  56. ##
  57. ## 加载R包,如果缺少该包就安装
  58. ##
  59. ##
  60. if (!(suppressWarnings(require("ape")))) {
  61.   install.packages("ape")
  62.   require(ape)
  63. }
  64. ## suppressWarnings函数用于忽略警告(warn),如果报错suppressWarnings返回的值为FALSE

  65. if (!(suppressWarnings(require("nlme")))) {
  66.   install.packages("nlme")
  67.   require(nlme)
  68. }
  69. ##
  70. ##第一步,确定两个时期品种的维度、温度、海拔均值
  71. #
  72. doStep1 <- TRUE
  73. if (doStep1) {
  74.   
  75.   
  76.   ## 载入数据
  77.   if (!exists("rawData")) rawData <- read.csv(paste0(rawDataPath, "data_bombclimate.csv"), stringsAsFactors=FALSE)
  78.   speciesTable <- unique(rawData[, c("species", "continent")])
  79.   samplingPeriods <- unique(rawData[, c("periodFrom", "periodTo")])
  80.   #exists用于检查对象是否在内存中,kmNorthEquator指从赤道向北的距离,maxPeriodAnnualMeanT年平均最高气温
  81.   
  82.   rawRangeShift <- list()
  83.   speciesKmNorthEquator <- list()
  84.   speciesElevation <- list()
  85.   cnt <- 0
  86.   
  87.   ## 确定每个品种的均值
  88.   for (iSpecies in 1:nrow(speciesTable)) {
  89.    
  90.     cat(speciesTable[iSpecies, "species"], "\n")#输出抽提的品种名称
  91.    
  92.     ## 将这一品种所有时期的数据从原始数据(rawData)中抽取出来
  93.     thisSpecies <- rawData[rawData$species==speciesTable[iSpecies, "species"] &
  94.                              rawData$continent==speciesTable[iSpecies, "continent"], ]
  95.    
  96.     ## 计算这一品种的均值(不分时期)
  97.     speciesKmNorthEquator[[iSpecies]] <- mean(thisSpecies$kmNorthEquator)
  98.     speciesElevation[[iSpecies]] <- mean(thisSpecies$elevation)
  99.    
  100.     ## 分时期计算均值
  101.     for (iPeriod in 1:nrow(samplingPeriods)) {
  102.       
  103.       ## 提取这个品种每个时期的原始数据
  104.       thisSpeciesPeriod <- rawData[rawData$species==speciesTable[iSpecies, "species"] &
  105.                                      rawData$continent==speciesTable[iSpecies, "continent"] &
  106.                                      rawData$periodFrom==samplingPeriods[iPeriod, "periodFrom"] &
  107.                                      rawData$periodTo==samplingPeriods[iPeriod, "periodTo"], ]
  108.       
  109.       thisSpeciesPeriodN <- nrow(thisSpeciesPeriod)
  110.       
  111.       ## 对该品种发现的地点去重,因为一个地点可能有多次记录
  112.       uniqueLoc <- !duplicated(thisSpeciesPeriod$spPerLoc)
  113.       
  114.       ## 计算以距离定义的寒冷地区的均值和炎热地区的均值,寒冷地区指距离迟到最远的5个地区,炎热地区反之,个数可以自己定义
  115.       thisLat <- thisSpeciesPeriod$kmNorthEquator[uniqueLoc][order(thisSpeciesPeriod$kmNorthEquator[uniqueLoc], decreasing=TRUE)]
  116.       thisLatCold <- mean(thisLat[1:numExtremeObs], na.rm=TRUE)
  117.       thisLatHot <- mean(rev(thisLat)[1:numExtremeObs], na.rm=TRUE)#rev为反转
  118.       
  119.       ## 计算以温度定义的炎热地区及寒冷地区
  120.       thisThermalMax <- thisSpeciesPeriod$maxPeriodAnnualMeanT[uniqueLoc]
  121.       thisThermalMax <- thisThermalMax[order(thisThermalMax, decreasing=TRUE)]
  122.       thisThermalMin <- thisSpeciesPeriod$minPeriodAnnualMeanT[uniqueLoc]
  123.       thisThermalMin <- thisThermalMin[order(thisThermalMin)]
  124.       thisThermalCold <- mean(thisThermalMin[1:numExtremeObs], na.rm=TRUE)
  125.       thisThermalHot <- mean(thisThermalMax[1:numExtremeObs], na.rm=TRUE)
  126.       
  127.       ## 计算该品种该时期的平均海拔
  128.       thisMeanElevation <- mean(thisSpeciesPeriod$elevation, na.rm=TRUE)
  129.       
  130.       ## 计算该品种该时段的维度中间点,中间点即均值
  131.       thisMeanKmNorthEquator <- mean(thisSpeciesPeriod$kmNorthEquator[uniqueLoc], na.rm=TRUE)
  132.       
  133.       ## 将以上计算的探索结果整理成data.frame
  134.       cnt <- cnt + 1
  135.       rawRangeShift[[cnt]] <-  data.frame(species=speciesTable[iSpecies, "species"],
  136.                                           continent=speciesTable[iSpecies, "continent"],
  137.                                           periodYears=paste(samplingPeriods[iPeriod, c("periodFrom", "periodTo")], collapse="to"),
  138.                                           period=paste0("t", iPeriod),
  139.                                           latitudeHot=thisLatHot, latitudeCold=thisLatCold,
  140.                                           thermalHot=thisThermalHot, thermalCold=thisThermalCold,
  141.                                           elevation=thisMeanElevation,
  142.                                           latitude=thisMeanKmNorthEquator,
  143.                                           N=thisSpeciesPeriodN)
  144.       
  145.     }
  146.    
  147.   }
  148.   
  149.   rawRangeShift <- do.call(rbind, rawRangeShift)
  150.   speciesKmNorthEquator <- do.call(rbind, speciesKmNorthEquator)
  151.   speciesElevation <- do.call(rbind, speciesElevation)
  152.   
  153.   
  154.   
  155.   ## 对品种—时期均值数据框整形,以适应针对品种建模过程
  156.   rangeShift <- reshape(rawRangeShift, idvar=c("species", "continent"), timevar="period", direction="wide", sep="_")
  157.   ## 这个数据整形的函数用的比较古老,dcast更加高大上
  158.   ## 计算每品种—时期 deltas (deltas指t2到t1; t3到t1;t4到t1变化)并将其加入数据框
  159.   ##
  160.   vars <- apply(expand.grid(c("latitudeHot", "latitudeCold", "thermalHot", "thermalCold", "elevation", "N"), c("t2", "t3", "t4")), 1, function(x) paste(x, collapse="_"))
  161.   vars <- data.frame(tX=vars, t1=gsub("t2|t3|t4", "t1", vars), delta=paste0("delta_", vars), stringsAsFactors=FALSE)
  162.   ## 这里要说一下expand.grid函数,他将所有变量下的因子进行组合形成一个data.frame,比如说第一个变量
  163.   ## 第二变量有三个因子,他们组成的记过就是一个就是一个有两个变量6行数据组成的数据框
  164.   
  165.   delta <- lapply(1:nrow(vars), function(x) {
  166.     y <- data.frame(rangeShift[, vars[x, "tX"]] - rangeShift[, vars[x, "t1"]])
  167.     names(y) <- vars[x, "delta"]
  168.     return(y)
  169.   })
  170.   rangeShift <- data.frame(rangeShift, do.call(cbind, delta))
  171.   
  172.   
  173.   ## 将品种的维度均值和海拔均值加入数据框
  174.   rangeShift <- data.frame(rangeShift, meanLatitude=speciesKmNorthEquator, meanElevation=speciesElevation)
  175.   
  176.   ## 将杀虫剂数据加入数据框(仅限于北美品种有杀虫剂使用数据)
  177.   pesticides <- read.csv(paste0(rawDataPath, "speciesUSA_pesticides.csv"))
  178.   speciesIndex <- match(pesticides$species, rangeShift$species)
  179.   
  180.   rangeShift$usaTotalPest_t3 <- NA
  181.   rangeShift$usaTotalPest_t3[speciesIndex] <- pesticides$totalPest_t3
  182.   rangeShift$usaTotalPest_t4 <- NA
  183.   rangeShift$usaTotalPest_t4[speciesIndex] <- pesticides$totalPest_t4
  184.   rangeShift$usaNeonics_t3 <- NA
  185.   rangeShift$usaNeonics_t3[speciesIndex] <- pesticides$neonics_t3
  186.   rangeShift$usaNeonics_t4 <- NA
  187.   rangeShift$usaNeonics_t4[speciesIndex] <- pesticides$neonics_t4
  188.   ## 作者对R的函数实在不熟悉,以上那么多句可以用一句完成
  189.   ## rangeShift <- join(rangeShift, pesticides)
  190.   
  191.   ## 添加土地使用情况的数据(包括北美和欧洲)
  192.   landuse <- read.csv(paste0(rawDataPath, "species_landuse.csv"))
  193.   rangeShift <- data.frame(rangeShift, landuse[, -1])
  194.   
  195.   ## If removeSpecies is set, remove those species from the dataset that match the
  196.   ## regular expression given above
  197.   if (!is.logical(removeSpecies)) {
  198.     cat("Removing:", gsub("\\|", ", ", removeSpecies), "\n")#这里gsub省略了要移除的品种,可以在“\\|”添加
  199.     rangeShift <- rangeShift[!grepl(removeSpecies, rangeShift$species), ]
  200.   }
  201.   
  202. }

  203. ## ---------------------------------------------------------------
  204. ## 第二步
  205. ## ---------------------------------------------------------------
  206. ## 为delta维度、温度数据构建最小二乘法回归模型,
  207. ## 然后选取AIC最低的OLS模型构建phylogenetic generalized least-squares (PGLS)回归模型,用来检测
  208. ## 两个或多个相关变量在整个种群树上是否表现出显著性,例如对于一个物种,
  209. ## 如果两个变量表现出强烈相关,那与该物种比较近亲的物种也可能表现出相同的相关性
复制代码

上述是Science近日发表的文章的R脚本特点如下:
1.规范,包括书写、命名、格式规范
2.全程一个脚本,完成所有分析任务,完整性和整合性明显
3.作者用的R包很少,但这也限制了作者代码的间接性。
4.细节和代码串联的方法值得学习
5.个别小错误,比如将cbind写成了c
更多数据和关于phylogenetic generalized least-squares (PGLS)回归模型的脚本请关注我们
相关数据及代码:http://pan.baidu.com/s/1i3rNTul  密码:微信索取
关于我们,关注理性与文艺,用数据创作内容性的精致阅读,这里是数据分析挖掘人员与文艺青年的集结地,不做培训,不做鼓吹,只踏踏实实的做一个又一个数据驱动的文章,并设计机器人减轻数据分析的负担,无论你感兴趣还是想参与都可以关注,请加微信公众号大音如霜
qrcode_for_gh_89f96c48034b_430.jpg

analysisScript_KerrPindarGalpern_etal_Science_2015.txt (59.28 KB)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:自然杂志 Continent converge Impacts Climate science

沙发
sssyunsheng 在职认证  发表于 2015-7-15 20:19:44 |只看作者 |坛友微信交流群
擦,代码超过最大行,可以下载,数据可以去我网盘下载,也可以搜索

使用道具

藤椅
sssyunsheng 在职认证  发表于 2015-7-15 20:20:21 |只看作者 |坛友微信交流群
擦,代码超过最大行,可以下载,数据可以去我网盘下载,也可以搜索

使用道具

板凳
nieqiang110 学生认证  发表于 2015-7-15 23:20:52 |只看作者 |坛友微信交流群
楼主好人,好人做到底,能否把数据传上来,要论坛币也可以的

使用道具

报纸
nieqiang110 学生认证  发表于 2015-7-16 10:16:41 |只看作者 |坛友微信交流群
微信搞了,也不行

使用道具

地板
sssyunsheng 在职认证  发表于 2015-7-16 12:09:38 |只看作者 |坛友微信交流群
nieqiang110 发表于 2015-7-16 10:16
微信搞了,也不行
链接:http://pan.baidu.com/s/1i3rNTul 密码:ubii
或者
http://datadryad.org/resource/doi:10.5061/dryad.gf774

使用道具

7
nieqiang110 学生认证  发表于 2015-7-16 12:29:12 |只看作者 |坛友微信交流群
谢谢楼主,好人啊。再次感谢!

使用道具

8
rng_ 发表于 2017-3-15 10:46:48 来自手机 |只看作者 |坛友微信交流群
sssyunsheng 发表于 2015-7-15 20:04
上述是Science近日发表的文章的R脚本特点如下:
1.规范,包括书写、命名、格式规范
2.全程一个脚本,完 ...
吊吊吊

使用道具

9
lonestone 在职认证  发表于 2017-3-16 06:29:54 来自手机 |只看作者 |坛友微信交流群
sssyunsheng 发表于 2015-7-15 20:04
上述是Science近日发表的文章的R脚本特点如下:
1.规范,包括书写、命名、格式规范
2.全程一个脚本,完 ...
谢谢你

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 01:47