搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  analysisScript_KerrPindarGalpern_etal_Science_2015.txt
资料下载链接地址: https://bbs.pinggu.org/a-1832508.html
附件大小:
59.28 KB   举报本内容
  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. if (!exists("rawData")) rawData <- read.csv(paste0(rawDataPath, "data_bombclimate.csv"), stringsAsFactors=FALSE)
  76. speciesTable <- unique(rawData[, c("species", "continent")])
  77. samplingPeriods <- unique(rawData[, c("periodFrom", "periodTo")])
  78. #exists用于检查对象是否在内存中,kmNorthEquator指从赤道向北的距离,maxPeriodAnnualMeanT年平均最高气温

  79. rawRangeShift <- list()
  80. speciesKmNorthEquator <- list()
  81. speciesElevation <- list()
  82. cnt <- 0

  83. ## 确定每个品种的均值
  84. for (iSpecies in 1:nrow(speciesTable)) {

  85. cat(speciesTable[iSpecies, "species"], "\n")#输出抽提的品种名称

  86. ## 将这一品种所有时期的数据从原始数据(rawData)中抽取出来
  87. thisSpecies <- rawData[rawData$species==speciesTable[iSpecies, "species"] &
  88. rawData$continent==speciesTable[iSpecies, "continent"], ]

  89. ## 计算这一品种的均值(不分时期)
  90. speciesKmNorthEquator[[iSpecies]] <- mean(thisSpecies$kmNorthEquator)
  91. speciesElevation[[iSpecies]] <- mean(thisSpecies$elevation)

  92. ## 分时期计算均值
  93. for (iPeriod in 1:nrow(samplingPeriods)) {

  94. ## 提取这个品种每个时期的原始数据
  95. thisSpeciesPeriod <- rawData[rawData$species==speciesTable[iSpecies, "species"] &
  96. rawData$continent==speciesTable[iSpecies, "continent"] &
  97. rawData$periodFrom==samplingPeriods[iPeriod, "periodFrom"] &
  98. rawData$periodTo==samplingPeriods[iPeriod, "periodTo"], ]

  99. thisSpeciesPeriodN <- nrow(thisSpeciesPeriod)

  100. ## 对该品种发现的地点去重,因为一个地点可能有多次记录
  101. uniqueLoc <- !duplicated(thisSpeciesPeriod$spPerLoc)

  102. ## 计算以距离定义的寒冷地区的均值和炎热地区的均值,寒冷地区指距离迟到最远的5个地区,炎热地区反之,个数可以自己定义
  103. thisLat <- thisSpeciesPeriod$kmNorthEquator[uniqueLoc][order(thisSpeciesPeriod$kmNorthEquator[uniqueLoc], decreasing=TRUE)]
  104. thisLatCold <- mean(thisLat[1:numExtremeObs], na.rm=TRUE)
  105. thisLatHot <- mean(rev(thisLat)[1:numExtremeObs], na.rm=TRUE)#rev为反转

  106. ## 计算以温度定义的炎热地区及寒冷地区
  107. thisThermalMax <- thisSpeciesPeriod$maxPeriodAnnualMeanT[uniqueLoc]
  108. thisThermalMax <- thisThermalMax[order(thisThermalMax, decreasing=TRUE)]
  109. thisThermalMin <- thisSpeciesPeriod$minPeriodAnnualMeanT[uniqueLoc]
  110. thisThermalMin <- thisThermalMin[order(thisThermalMin)]
  111. thisThermalCold <- mean(thisThermalMin[1:numExtremeObs], na.rm=TRUE)
  112. thisThermalHot <- mean(thisThermalMax[1:numExtremeObs], na.rm=TRUE)

  113. ## 计算该品种该时期的平均海拔
  114. thisMeanElevation <- mean(thisSpeciesPeriod$elevation, na.rm=TRUE)

  115. ## 计算该品种该时段的维度中间点,中间点即均值
  116. thisMeanKmNorthEquator <- mean(thisSpeciesPeriod$kmNorthEquator[uniqueLoc], na.rm=TRUE)

  117. ## 将以上计算的探索结果整理成data.frame
  118. cnt <- cnt + 1
  119. rawRangeShift[[cnt]] <-data.frame(species=speciesTable[iSpecies, "species"],
  120. continent=speciesTable[iSpecies, "continent"],
  121. periodYears=paste(samplingPeriods[iPeriod, c("periodFrom", "periodTo")], collapse="to"),
  122. period=paste0("t", iPeriod),
  123. latitudeHot=thisLatHot, latitudeCold=thisLatCold,
  124. thermalHot=thisThermalHot, thermalCold=thisThermalCold,
  125. elevation=thisMeanElevation,
  126. latitude=thisMeanKmNorthEquator,
  127. N=thisSpeciesPeriodN)

  128. }

  129. }

  130. rawRangeShift <- do.call(rbind, rawRangeShift)
  131. speciesKmNorthEquator <- do.call(rbind, speciesKmNorthEquator)
  132. speciesElevation <- do.call(rbind, speciesElevation)



  133. ## 对品种—时期均值数据框整形,以适应针对品种建模过程
  134. rangeShift <- reshape(rawRangeShift, idvar=c("species", "continent"), timevar="period", direction="wide", sep="_")
  135. ## 这个数据整形的函数用的比较古老,dcast更加高大上
  136. ## 计算每品种—时期 deltas (deltas指t2到t1; t3到t1;t4到t1变化)并将其加入数据框
  137. ##
  138. vars <- apply(expand.grid(c("latitudeHot", "latitudeCold", "thermalHot", "thermalCold", "elevation", "N"), c("t2", "t3", "t4")), 1, function(x) paste(x, collapse="_"))
  139. vars <- data.frame(tX=vars, t1=gsub("t2|t3|t4", "t1", vars), delta=paste0("delta_", vars), stringsAsFactors=FALSE)
  140. ## 这里要说一下expand.grid函数,他将所有变量下的因子进行组合形成一个data.frame,比如说第一个变量
  141. ## 第二变量有三个因子,他们组成的记过就是一个就是一个有两个变量6行数据组成的数据框

  142. delta <- lapply(1:nrow(vars), function(x) {
  143. y <- data.frame(rangeShift[, vars[x, "tX"]] - rangeShift[, vars[x, "t1"]])
  144. names(y) <- vars[x, "delta"]
  145. return(y)
  146. })
  147. rangeShift <- data.frame(rangeShift, do.call(cbind, delta))


  148. ## 将品种的维度均值和海拔均值加入数据框
  149. rangeShift <- data.frame(rangeShift, meanLatitude=speciesKmNorthEquator, meanElevation=speciesElevation)

  150. ## 将杀虫剂数据加入数据框(仅限于北美品种有杀虫剂使用数据)
  151. pesticides <- read.csv(paste0(rawDataPath, "speciesUSA_pesticides.csv"))
  152. speciesIndex <- match(pesticides$species, rangeShift$species)

  153. rangeShift$usaTotalPest_t3 <- NA
  154. rangeShift$usaTotalPest_t3[speciesIndex] <- pesticides$totalPest_t3
  155. rangeShift$usaTotalPest_t4 <- NA
  156. rangeShift$usaTotalPest_t4[speciesIndex] <- pesticides$totalPest_t4
  157. rangeShift$usaNeonics_t3 <- NA
  158. rangeShift$usaNeonics_t3[speciesIndex] <- pesticides$neonics_t3
  159. rangeShift$usaNeonics_t4 <- NA
  160. rangeShift$usaNeonics_t4[speciesIndex] <- pesticides$neonics_t4
  161. ## 作者对R的函数实在不熟悉,以上那么多句可以用一句完成
  162. ## rangeShift <- join(rangeShift, pesticides)

  163. ## 添加土地使用情况的数据(包括北美和欧洲)
  164. landuse <- read.csv(paste0(rawDataPath, "species_landuse.csv"))
  165. rangeShift <- data.frame(rangeShift, landuse[, -1])

  166. ## If removeSpecies is set, remove those species from the dataset that match the
  167. ## regular expression given above
  168. if (!is.logical(removeSpecies)) {
  169. cat("Removing:", gsub("\\|", ", ", removeSpecies), "\n")#这里gsub省略了要移除的品种,可以在“\\|”添加
  170. rangeShift <- rangeShift[!grepl(removeSpecies, rangeShift$species), ]
  171. }

  172. }

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

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




    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2025-12-31 20:56