重现性:随着时间的推移无法重新运行代码

2024-02-23

我担心将来运行的代码可能会失败。我见过这个tidyverse运行良好但一段时间后返回错误的函数,因为它们已被Defunct https://stackoverflow.com/a/5963610/11359310。要给出一些可重现的示例,请尝试这段代码如何制作一个出色的 R 可重现示例 https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610#5963610具有讽刺意味的是,这不再是可重现的(比较age and x到原来的帖子):

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
  id       date group age   type           x
1  1 2020-12-26     A  29 type 1  0.63286260
2  2 2020-12-27     B  30 type 2  0.40426832
3  3 2020-12-28     A  21 type 3 -0.10612452
4  4 2020-12-29     B  28 type 4  1.51152200
5  5 2020-12-30     A  26 type 5 -0.09465904
6  6 2020-12-31     B  24 type 6  2.01842371

Question

Is it only更新后,相同的代码会返回不同的输出吗?换句话说:包和R它本身通常不会自动更新,那么这是否意味着只要我不手动更新任何内容,我就可以“永恒”地重新运行某个函数?有什么例外吗?

我为什么问

我使用以下方法为我的公司加密敏感数据bcrypt封装在R。我们需要加密数据and删除原始数据。一旦完成,就没有回头路,也就是说,我真的必须信任代码。我没有使用任何包,但是bcrypt, shiny and shinydashboard.

Edit

我的问题假设代码在同一系统上运行,而不更改全局设置(在 @qdread 的评论后编辑),并且不更改 R 版本。

我的具体工作:我处理患者数据。首先,我为每个患者选择一个由字母和数字组成的随机 ID,例如A72CV for Max Cooper 1987-05-03。在下一步中我使用bcrypt为每个患者创建盐,然后使用盐创建 ID 的哈希/加密版本(盐 + ID = 加密 ID)。因此,每个患者都有姓名+出生日期、随机字母/数字 ID、盐(使用生成)salt <- bcrypt::gensalt(log_rounds = 12))和加密的 ID(使用生成id_encrypted <- bcrypt::hashpw(id, salt = salt))。我将数据保存在三个独立的文件中:(i) 患者数据,即姓名和出生日期以及加密的 ID,(ii) ID 和盐,以及 (iii) 包含 ID 和许多感兴趣变量的实际数据库,例如吸烟者/体重,...这种方法是由一些机构在我工作的环境中推荐的,称为假名化(可逆加密)。它确保即使存在数据泄漏,识别变量名称+生日和所有感兴趣的变量(吸烟者,...)之间也没有明显的联系。我制作了一个闪亮的应用程序,允许我的同事 (1) 提供 ID 并查找姓名 + 出生日期,(2) 提供姓名 + 出生日期并查找 ID,(3) 为新患者生成 ID。这一切都有效,因为具有相同盐的相同 ID 会产生相同的加密(散列)ID - 至少目前是这样。但是,如果将来由于某种原因相同的输入(例如 ID)不会返回相同的输出(例如姓名+出生日期),我就完全搞砸了。另一方面,如果随机 ID 的生成会随着时间的推移而改变,这也不是一个大问题,因为每个 ID 仅创建和保存一次,即该过程不必是可重复的。所描述的加密方法将应用于我的机构花费多年时间收集的一些数据库。如果我们无法重新创建数据,那么一切都会丢失。这就是为什么代码稳定性对我如此重要。我会在我同事的windows电脑上安装shinyApp。他们只会打run App inside R然后执行之前描述的选项之一(1 至 3)。


(部分答案。)

默认行为sample在 R-3.6.0 中进行了更改。值得注意的是,在NEWS-3 https://cran.r-project.org/doc/manuals/r-devel/NEWS.3.html根据 R-3.6.0,它规定用户可见的重大变化:

从离散均匀分布生成的默认方法(用于sample(),例如)已更改。这解决了奥托博尼和斯塔克指出的事实,即先前的方法使得sample()在大量人群中明显不均匀。看PR#17494 https://bugs.r-project.org/show_bug.cgi?id=17494进行讨论。可以使用之前的方法来请求RNGkind() or RNGversion()如果需要重现旧结果。感谢邓肯·默多克 (Duncan Murdoch) 提供的补丁以及加布·贝克尔 (Gabe Becker) 的进一步帮助。

我们可以重新获得age通过改变随机值sample.kind="Rounding",

RNGkind(sample.kind = "Rounding")
# Warning in RNGkind(sample.kind = "Rounding") :
#   non-uniform 'Rounding' sampler used

set.seed(42)  ## for sake of reproducibility
n <- 6
dat <- data.frame(id=1:n, 
                  date=seq.Date(as.Date("2020-12-26"), as.Date("2020-12-31"), "day"),
                  group=rep(LETTERS[1:2], n/2),
                  age=sample(18:30, n, replace=TRUE),
                  type=factor(paste("type", 1:n)),
                  x=rnorm(n))
dat
#   id       date group age   type           x
# 1  1 2020-12-26     A  29 type 1  0.63286260
# 2  2 2020-12-27     B  30 type 2  0.40426832
# 3  3 2020-12-28     A  21 type 3 -0.10612452
# 4  4 2020-12-29     B  28 type 4  1.51152200
# 5  5 2020-12-30     A  26 type 5 -0.09465904
# 6  6 2020-12-31     B  24 type 6  2.01842371

至于改变后的rnorm输出,在同一链接中指出

注:输出为set.seed()R >3.6.0 和之前版本之间存在差异。指定您用于随机过程的 R 版本,如果您在遵循旧问题时得到略有不同的结果,请不要感到惊讶。要在这种情况下获得相同的结果,您可以使用RNGversion()- set.seed() 之前的函数(例如:RNGversion("3.5.2")).

不幸的是,我无法重现该链接的版本x-column.


生产中如何处理?在单元测试中依赖真正的随机数总是很粗略(出于这样的原因),主要有两个原因:您不能总是假设未种子的随机值会满足您想要的极端情况;正如您在此处看到的,种子随机值会受到“错误修复”或 PRNG 流程改进的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重现性:随着时间的推移无法重新运行代码 的相关文章

  • R data.table fwrite 到 fread 空间分隔符并清空

    我在使用 fread 以 作为分隔符和散布的空白值时遇到问题 例如 这个 dt lt data table 1 5 1 5 1 5 make a simple table dt 3 V2 NA add a blank in the midd
  • 如何确定 R 包的作者?

    如何确定包的作者是谁 鉴于我们拥有这个广泛使用的代码库 我认为参考我在分析中使用的软件是合适的 有没有办法以编程方式检索作者和任何其他相关信息 在伪代码中 我想执行以下操作 references base 我怎样才能做到这一点 为了能够引用
  • 如何返回包含最大值标签的向量

    我有一个 4 列数组 我想获得一个向量 其中每行包含包含该行最大值的列的标签 我可以在循环中执行此操作 但我想使用矩阵函数来提高速度 我怎样才能在不编写自己的库函数的情况下做到这一点 有一个函数可以做到这一点 如果x是你的矩阵 尝试max
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 如何自动启动我的 ec2 实例、运行命令然后将其关闭?

    我想每周对 redshift postgres 数据库中的数据运行一次机器学习模型 我使用以下命令将 R 脚本设置为休息 apiplumbr然后我将其设置为一项任务来管理pm2 我有它 所以任务会在ec2实例启动然后继续运行 要让 R 脚本
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会
  • RStudio 如何确定控制台宽度,为什么它似乎总是出错?

    我刚刚发现wid lt options width在 RStudio 中 它似乎是我日常控制台使用中令人烦恼的根源 或者更确切地说 更接近根源 我应该先说一下 我目前使用的是 R 3 2 2 RStudio 0 99 491 Linux M
  • ubuntu中R的igraph包的安装

    我使用以下命令在 ubuntu 中安装 R 的 igraph 包 install packages igraph 但我收到一条错误消息 警告 无法访问存储库的索引 http ftp iitm ac in cran src contrib h
  • 对 data.table 中的列表列执行操作

    假设我有一个data table 例如dt lt data table foo list 1 3 4 6 bar c 2 7 如何使用 dt 框架对 foo 向量列表执行操作 操作可能是将 bar 添加到 foo 返回列表 3 5 11 1
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • R 将多个值与向量进行比较并返回向量[重复]

    这个问题在这里已经有答案了 我有一个向量 A 对于 A 的每个元素 我想检查它是否等于第二个向量 Targets 中的任何元素 我想要一个逻辑值向量 其长度为 A 作为返回 也提到了同样的问题here http r 789695 n4 na
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • 如何在knitr和RStudio中为word和html设置不同的全局选项?

    我正在使用 RStudio 0 98 932 和 knitr 1 6 想要为word和html设置不同的全局knitr选项 例如 想要将word的fig width和fig height设置为6 html的fig width和fig hei
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 使用officer R导出时如何提高ggplots的分辨率

    我想将图表导出到 PPT 并使用Officer 包来实现相同的目的 但是 图表的默认分辨率较低 我想更改它 我目前正在使用以下电话 ph with gg p1 type chart res 1200 其中 p1 是 ggplot 对象 运行
  • 正态分布平均值的贝叶斯推理玩具 R 代码 [降雪量数据]

    我有一些降雪观测 x lt c 98 044 107 696 146 050 102 870 131 318 170 434 84 836 154 686 162 814 101 854 103 378 16 256 我被告知它遵循正态分布
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch

随机推荐

  • 如何使用 UnetStack 中的代理从路由表中删除路由条目

    在我的路由协议中 我想定期动态更新路由表 到目前为止 我正在从我的代理向路由表添加路由条目 方法是发送RouteDiscoveryNtf向路由器代理发送消息 这类似于使用addroute封闭在壳内 我想知道 我如何删除路由条目 这样 我就可
  • 基于谷歌地图 API v2 的 Android 应用程序启动时出现模糊地图图块

    我有一个包含 Google 地图 APIv2 的应用程序 启动应用程序后 地图图块变得模糊 有时只是某些部分 仅当用户稍微移动地图视图时 图块才会变得清晰 通过代码移动地图视图确实not解决这个问题 有任何想法吗 我有类似的问题 地图会呈现
  • Python round() 太慢,更快的方法来降低精度?

    我正在做以下事情 TOLERANCE 13 some float round some float TOLERANCE 这会运行很多次 因此性能很重要 由于浮点表示错误 我必须对 some float 进行舍入 从这个意义上讲 我实际上不需
  • make_shared 与自定义 new 运算符

    这可能是重复的 但我无法在任何地方找到解决方案 我有这样的源代码 struct Blob static void operator new size t size reported size t size return operator n
  • NodeJS 产生 ENOENT 错误

    我在远程服务器上使用 GM 时遇到错误 我想当我尝试写入文件时遇到问题 它在我的本地服务器上完美运行 我的代码 gm in page 0 0 in var www myapp public images instabox jpg in pa
  • Go lang如何检查浮点值是否实际上是int [重复]

    这个问题在这里已经有答案了 func isFloatInt floatValue float64 bool What s the implementation here 测试用例 输入 1 5 输出 假 输入 1 输出 true 输入 1
  • Matlab 的 fminunc 函数在 R 中的等价物是什么?

    为了计算最佳 theta 例如在逻辑回归中 我必须创建一个 costFunction 要最小化的函数 然后将其传递给 fminunc 以获得最佳 theta 另外 如果可以计算 costFunction 的梯度 我使用以下命令将 GradO
  • 在 Woocommerce 中禁用特定优惠券代码的“购物车需要付款”

    当我有特定优惠券 例如 tcrfam 时 我需要隐藏信用卡付款 并且当我使用任何与此不同的优惠券显示卡付款时 我的想法是 我不提供 100 或免费的优惠券 并且没有任何情况我会询问信用卡数据 See the example 我尝试了这段代码
  • 在 Google Colab 笔记本上安装 RAPIDS 库

    我想知道是否可以安装RAPIDS https rapids ai index htmlGoogle Colaboratory 笔记本中的库 完全在 GPU 上执行机器学习任务 我做了一些研究 但我无法找到做到这一点的方法 现在新的 T4 实
  • 如何使用Powershell获取CSV数据的列标题?

    如何获取 CSV 数据的列标题 下面是具体数据 PS home nicholas powershell covid gt PS home nicholas powershell covid gt labsURL http www bccdc
  • 如何在 git 中合并其他人项目的拉取请求?

    我在我的计算机上克隆了这个存储库 https github com derobins wmd git https github com derobins wmd git 不过它有几个错误 看起来另一个用户已经修复了它们并发出了 拉取请求 我
  • 将指针传递给汇编函数

    我对汇编编程相当陌生 我正在使用带有 GCC Linux 的 x86 平台 我有一个我想从 C 调用的函数 myfunc unsigned char s1 unsigned char s2 int someint 该函数将获取 s1 和 s
  • 使用 PHPMyAdmin 拒绝用户“root”@“localhost”的访问

    当我在 PHPMyAdmin 中设置 root 密码时 出现以下错误 1045 Access denied for user root localhost using password NO 我无法打开 PHPMyAdmin 面板 我究竟做
  • docker run 具有多个命令的入口点

    我怎样才能有一个入口点docker run它执行多个命令 就像是 docker run entrypoint echo hello echo world
  • 从 Keyrock 固件 API 获取 Auth-Token

    我在我的笔记本电脑上的 docker 本地运行 Keyrock Fiware 我知道这有效 因为我可以访问http localhost 8000 and http localhost 8000 sign up通过我的浏览器 他们响应正确 我
  • 流畅的 NHibernate - HasMany().WithKeyColumnName

    我刚刚从 Google 代码中获得了最新版本的 Fluent 自从我上次使用它以来 一些映射似乎已经发生了变化 以前 当我加入的 id 在第二个表中具有不同的名称时 我可以使用以下命令映射关系 HasMany x gt x Roles Wi
  • 如何从原始数据创建 BufferedImage

    我试图从原始样本中获取 BufferedImage 但在尝试读取超出可用数据范围时出现异常 我只是不明白 我想做的是 val datasize image width image height val imgbytes image data
  • 如何使用 C# 代码读取文件?

    我有一个文件包含两行 哪一行有一个double范围 我想从文件中读取两行并将它们保存在 doubles 数组中 我使用了下面的 C 代码 但它不起作用 运行代码后它不会读取任何内容并且数组为空 有人知道我哪里做错了吗 感谢帮助 privat
  • Jackson Json Mapper:没有字段还是空字段?

    我使用 Jackson Json Mapper 来解析服务器上的查询 例如 我正在等待适合班级的查询My class class My class String a String b 我这样反序列化查询 public
  • 重现性:随着时间的推移无法重新运行代码

    我担心将来运行的代码可能会失败 我见过这个tidyverse运行良好但一段时间后返回错误的函数 因为它们已被Defunct https stackoverflow com a 5963610 11359310 要给出一些可重现的示例 请尝试