专栏首页庄闪闪的R语言手册R问题|数值模拟流程记录和分享

R问题|数值模拟流程记录和分享

简介

最近在做论文模拟实验并将实验结果进行可视化。下面是我这阶段的一些经验总结,在此记录下,也希望能够帮助到你。

方法不一定最优,也欢迎批评指正。由于工作还在继续,完整代码现阶段不会公开,下面给出部分代码和代码编写思路。

整个工作流程:由于参数不同,会得到不同的结果。我的目标是将不同参数模拟的结果最后通过一副图进行可视化。

难点:每个脚本代码量较大,模拟时间较长(10h+),为了方便起见,我将不同参数单独构建成一个脚本,然后开启多个Rstudio,进行“人工”并行运算并保存各个脚本的 Rdata 和数据集。最后新建一个 R 脚本,加载参数模拟结果并绘图。最终可视化结果如下:

这里的每行图形来自一个Rdata(一组参数),整幅图中包含了三组不同参数的结果。

首先看下我每个脚本中的代码缩略图以及部分脚本:

代码缩略图

部分脚本

注意: 为了方便查看,我将自己论文所需函数都放到了all_function.r脚本中,然后使用source()将其进行加载。脚本中参数修改主要是numbers,sigma,nums和it。

all_function.r缩略图

工作流程

接下来给出操作流程:

1.打开多个 Rstudio并运行

每个 Rstudio 中运行一个脚本代码。

2. 在每个 R 脚本中存储所有 Rdata 和数据集

代码如下:

write.xlsx(sheets, paste("./data/latex/sigma",sigma,"new2/R",numbers,"_",nums,"_",it,".xlsx",sep=""),
           colNames = T, rowNames = T)
save.image(paste("./data/latex/sigma",sigma,"new2/R",numbers,"_",nums,"_",it,".Rdata",sep=""))

注意: 这里有个小技巧,使用 paste() 函数,自动根据参数不同(这里是 sigma,numbers,nums,it),改变路径和文件名称(文件夹要提前建立好)。

这是运行完的结果如下。

3. 新建了一个R脚本,绘制图形

文件名叫 plot_all.r。主要功能是将刚才每个不同参数的脚本得到的数据绘制图形,然后使用相应的包将他们合成一个图。代码缩略图可见文末,这里先介绍各个函数的功能。如果对ggplot2绘制还存在一定难度的朋友,可以在公众号输入[可视化文稿]得到教程文稿,再结合我的b站(账号:庄闪闪)“R可视化教程”,进行快速的入门学习。

  • plot_5_methods功能:使用 ggplot2 包绘制一个数据集中某一列参数(b/c/d/sigma)的图形。
plot_5_methods = function(dat = b_data){
  plot_5 = ggplot(dat,aes(class,value,fill = class)) + 
    geom_boxplot(na.rm = T) + 
    # scale_fill_viridis(discrete = TRUE, alpha=0.6) +
    stat_summary(fun.y=mean, na.rm=T, geom="point", shape=21, size=2, fill="red",color="red") +
    # geom_jitter(color="black", size=0.4, alpha=0.9) +
    # geom_hline(yintercept = yline) +
    theme_bw() +
    theme(
      legend.position="none",
      panel.grid.major = element_blank(),
      panel.grid.minor = element_blank(),
      plot.title = element_text(size=11)
    ) +
    ylab("") + 
    xlab("") 
  return(plot_5)
}
  • all_plot_compare 功能:绘制一个数据集所有列,并将其横向合并,结果如下所示:
all_plot_compare = function(data1 = all_data_0.3,str1 = c(0, 3.5,0, 1,0, 10,0, 1.5)){
  ## b 
  b_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
                                       levels = c("GH","TS","BT","Pooled","Fixed")),
                      "value" = c(data1[,1],data1[,5],data1[,9],data1[,13],data1[,17]))
  b_plot = plot_5_methods(dat = b_data) +
    geom_hline(yintercept = b,linetype = 3) +
    scale_y_continuous(limits = str1[1:2]) + 
    xlab(expression(b)) + 
    scale_fill_manual(values = col1) 
  ## c 
  c_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
                                       levels = c("GH","TS","BT","Pooled","Fixed")),
                      "value" = c(data1[,2],data1[,6],data1[,10],data1[,14],data1[,18]))
  c_plot = plot_5_methods(dat = c_data) + 
    geom_hline(yintercept = c,linetype = 3) +
    scale_y_continuous(limits = str1[3:4]) + 
    xlab(expression(c)) + 
    scale_fill_manual(values = col1) 
  ## d
  d_data = data.frame("class" = factor(rep(c("GH","TS","BT","Pooled","Fixed"),each = dim1),
                                       levels = c("GH","TS","BT","Pooled","Fixed")),
                      "value" = c(data1[,3],data1[,7],data1[,11],data1[,15],data1[,19]))
  d_plot = plot_5_methods(dat = d_data) +
    geom_hline(yintercept = d,linetype = 3) +
    scale_y_continuous(limits = str1[5:6]) + 
    xlab(expression(d)) +  
    scale_fill_manual(values = col1) 
  ## sigma
  sigma_data = data.frame("class" = factor(rep(c("GH","TS","BT"),each = dim1),
                                           levels = c("GH","TS","BT")),
                          "value" = c(data1[,4],data1[,8],data1[,12]))
  sigma_plot = plot_5_methods(dat = sigma_data) +
    geom_hline(yintercept = sigma,linetype = 3) +
    scale_y_continuous(limits = str1[7:8]) + 
    xlab(expression(sigma)) + 
    scale_fill_manual(values = col1[1:3])  
  return(plot_grid(b_plot,c_plot,d_plot,sigma_plot,ncol = 4,nrow = 1))
}

注意:这里我将每个参数的 ylim 都放到 str1 参数中,方便人工修改。all_data_0.3 表示某个脚本得到的数据集。期间还加了一些 ggplot 参数,修改了颜色和加入 x 轴标题等(看个人喜好添加)。

all_plot_compare函数结果

  • 加载Rdata并绘制图形

前面两函数基本可以绘制一个数据集的所有图形了,之后我要将不同数据集加载进来(例如:load("~/Desktop/2021.06.06/data/latex/plot_data/R11_500_200_0.3.Rdata")),然后内部关键数据集(point_final)进行重新定义,并通过前面写的函数进行绘制,并保存到变量中(p_0.3)。

# sigma0.3
load("~/Desktop/2021.06.06/data/latex/plot_data/R11_500_200_0.3.Rdata")
all_data_0.3 = point_final
dim1 = nrow(all_data_0.3) 
p_0.3 = all_plot_compare(data1 = all_data_0.3)

最后使用ggpubr包中的annotate_figure()加入图片的标签,再使用cowplot包中的plot_grid()将图片进行合并。具体教程参考:R语言统计与绘图:给组合图形添加ABCD小标签R可视乎|合并多幅图形R语言ggplot2作图一些好看的颜色搭配paletteer包:拥有2100多个调色板!

代码如下:

fig11 = annotate_figure(p_0.3,
                        top = text_grob(bquote("("*sigma==0.3*")"),
                                        color = "black", size = 12))
fig21 = annotate_figure(p_0.5,
                        top = text_grob(bquote("("*sigma==0.5*")"),
                                        color = "black", size = 12))
fig31 = annotate_figure(p_0.8,
                        top = text_grob(bquote("("*sigma==0.8*")"),
                                        color = "black", size = 12))
plot_grid(fig11,fig21,fig31,ncol = 1,nrow = 3)

注意: 这里又有一个技巧:在标签中加入特殊符号,可以使用 expression() 函数,也可以使用我这里写的 bquote() 函数。

绘图代码缩略图

小编有话说

这里在做一些说明:

  • 可以直接 viridis 包进行颜色填充,例如:scale_fill_viridis(discrete = TRUE, alpha=0.6)。我这里使用手动加载颜色:scale_fill_manual(values = col1)
  • 如果图形中包含中文,可以使用 showtext 包解决该问题,代码如下:
library(showtext)
showtext.auto()
  • 整个流程还有一个思路:将所有函数构建成一个大的函数,只需要改变相应参数即可,这时代码量就会减少很多。
  • 希望半年后后头看这篇推文会有不一样的想法。希望到时候觉得现在的思路很幼稚!?

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:庄闪闪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫教程:爬取知乎网

    Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取...

    python学习教程
  • R-概率统计与模拟

    正如笔者在前文《公众号一岁啦》中所说,近期在复习概率统计相关的知识。机缘巧合,笔者遇到了几个比较有意思的题目,和朋友们分享一下:

    一只羊
  • 2017年11月R新包推荐

    一. 文档概述 11月份,在R官方(CRAN)共计发布了237个新包,本文选摘了40个R包,包含以下几个类别:计算方法、数据、数据科学、科学、社会科学、工具及可...

    企鹅号小编
  • HAWQ取代传统数仓实践(二)——搭建示例模型(MySQL、HAWQ)

    一、业务场景         本系列实验将应用HAWQ数据库,为一个销售订单系统建立数据仓库。本篇说明示例的业务场景、数据仓库架构、实验环境、源和目标库的建立过...

    用户1148526
  • 「Workshop」第一期:我理解的(生信)数据分析核心基础

    我在简书和公众号上已经分享了很多之前学习的数据分析笔记和文章,覆盖了各方面的内容,数据分析方面以后不会再个人分享特别基础的东西了。接下来我会让师弟师妹们定期分享...

    王诗翔呀
  • 【面试必备】手撕代码,你怕不怕?

    这绝对是属于重点了,不管是考察对于该重要模型的理解还是考察代码能力,这都是一道很好的考题,所以很有必要的,我们先来回顾一下什么是生产者-消费者问题;

    java架构师
  • 破解某滑动验证码

    首先申明:历时八天,本文作者(在多位好友的帮助下)已经成功破解该验证码成功率73%,但是出于网络安全与知识产权等因素(破解只是兴趣,不能咂人家饭碗),不会提供完...

    我在鹅厂做安全
  • 机器学习初体验(1)

    本文是作者在赤兔APP“数据挖掘”小组内在线分享的记录的第【1】部分。 分享主题:机器学习初体验 分享时间:2016年5月25日晚8:00-10:00 分享地点...

    叶锦鲤
  • 分布式计算技术MapReduce 详细解读

    上周我们学习了消息中间件的核心原理以及如何搭建一套高并发高可用且支持海量存储的生产架构(今天来设计一套高可用高并发、海量存储以及可伸缩的消息中间件生产架构),我...

    架构师修炼
  • 独家 | 利用Auto ARIMA构建高性能时间序列模型(附Python和R代码)

    本文共3400字,建议阅读10+分钟。 本文介绍了ARIMA的概念,并带你用Python和R训练一个数据集实现它。

    数据派THU
  • Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

    遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对...

    捡田螺的小男孩
  • 关于数据分析工具的终极问题

    昨晚在CPDA微课堂做了场直播,聊了一个终极问题,也是很多人在关注的话题。我把内容整理下来供读者们阅读、质疑和思考。(全文长6000多字)

    公众号PowerBI大师
  • 接入层Nginx架构及模块介绍分享

    1)帮助大家对Nginx有一定的认识 2)熟悉Nginx有哪些应用场景 3)熟悉Nginx特点和架构模型以及相关流程 4)熟悉Nginx定制化开发的几种模...

    Lucien168
  • 每日算法系列【LeetCode 42】接雨水

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    godweiyang
  • Oracle Linux6.9下安装Oracle 11.2.0.4.0及psu补丁升级

    Oracle (Enterprise) Linux 是一个基于 Red Hat Enterprise Linux 源码构建的 Linux 发行版,由 Oracl...

    loong576
  • lvs使用命令和参数

    指定虚拟服务器,是tcp的,端口80 ipvsadm -A -t 10.10.10.135:80

    陈不成i
  • 从这5个场景, 看MPC多方安全计算的行业应用

    在我们之前的“多方安全计算”系列文章中,我们首先通过姚期智教授的“百万富翁问题”引出了数据安全计算这个密码学话题,并介绍了多方安全计算在数据隐私中的应用场景。第...

    区块链大本营
  • LVS/DR模型集群模拟搭建与RR SH 调度配置

    小柒吃地瓜
  • Apache Spark 2.0预览:机器学习模型持久性

    以上所有应用场景在模型持久性、保存和加载模型的能力方面都更为容易。随着Apache Spark 2.0即将发布,Spark的机器学习库MLlib将在DataFr...

    人工智能资讯小编

扫码关注云+社区

领取腾讯云代金券