gpt4 book ai didi

r - 奇怪的 "changeable"导致 R 中的循环

转载 作者:行者123 更新时间:2023-12-04 15:30:44 25 4
gpt4 key购买 nike

更新2

第二个set.seed(i)应替换为 set.seed(i+1) ,或任何其他新的随机系列。如果没有,s3 <- sum(data$gene == 0 & data$cancer == 1)永远是0 , 因为数字小于 0.08将小于 0.39 .

我没有更正我原来的问题代码,因为这件事与这篇文章的核心问题无关。

更新

set.seed(i)添加两次,因为有两个随机数生成,即 random1random2 .然而,操作之间的结果仍然变化无常,这很奇怪。

背景:

下面的代码是关于odds ratios .但这里的重点不是统计。相反,我发现结果在一些实际上相同的操作中发生了变化(!)(我想它们实际上不是,但我无法弄清楚)。

代码:

gene <- vector(length = 500, mode = "integer")
cancer <- vector(length = 500, mode = "integer")
data <- data.frame(gene, cancer)

odd_withMutate <- vector(length = 20, mode = "numeric")
odd_noMutate <- vector(length = 20, mode = "numeric")
result <- data.frame(odd_withMutate, odd_noMutate)

for (i in 1:20) {
# set.seed(12)
# set.seed(16)
set.seed(i)
random1 <- runif(500, min = 0, max = 1)
# set.seed(12)
# set.seed(16)
set.seed(i) # add this instruction
random2 <- runif(500, min = 0, max = 1)
for (j in 1:500) {
if (random1[j] < 0.39){
data[j,1] <- 1
}
if (random2[j] < 0.08){
data[j,2] <- 1
}
}
s1 <- sum(data$gene == 1 & data$cancer == 1) # has the mutated gene & has cancer
s2 <- sum(data$gene == 1 & data$cancer == 0)
s3 <- sum(data$gene == 0 & data$cancer == 1)
s4 <- sum(data$gene == 0 & data$cancer == 0)
result[i,]$odd_withMutate <- s1/s2
result[i,]$odd_noMutate <- s3/s4
}

不同的操作:

操作#1:

如果我运行上面的代码,第 12 行 odd_noMutateresult将是 0 , 第 16 个将是 NaN .然后我试着看看发生了什么,所以我使用 set.seed(12)set.seed(16)检查(操作#2 和#3)。但是 0NaN消失了!我的意思是,在操作 #2 中,0.1638418 0不是 1.5075377 0 .在操作 #3 中,0.2830189 0不是 2.4013605 NaN .

操作#2:

代码的变化部分是:

  set.seed(12)   #odd_noMutate = 0
# set.seed(16) #odd_noMutate = NaN
# set.seed(i)
random1 <- runif(500, min = 0, max = 1)
set.seed(12)
# set.seed(16)
# set.seed(i) # add this instruction
random2 <- runif(500, min = 0, max = 1)

操作#3:

  # set.seed(12)   #odd_noMutate = 0
set.seed(16) #odd_noMutate = NaN
# set.seed(i)
random1 <- runif(500, min = 0, max = 1)
# set.seed(12)
set.seed(16)
# set.seed(i) # add this instruction

操作#4:

我发现甚至改变了 i在我的代码中会使结果完全不同(它不应该是原始结果的子集吗?)。这是操作#4。具体来说,0.3092105 0不是 1.5075377 0 ; 0.7562724 0不是 2.4013605 NaN .

for (i in 10:20) {
# set.seed(12) #odd_noMutate = 0
# set.seed(16) #odd_noMutate = NaN
set.seed(i)
random1 <- runif(500, min = 0, max = 1)
# set.seed(12)
# set.seed(16)
set.seed(i) # add this instruction
random2 <- runif(500, min = 0, max = 1)

这些操作的结果如下所示: Result

最佳答案

问题是 data 中的一些先前值保留并被重复使用。也许你的问题解决了重制data每个 for 循环 (i)。 (将 data <- data.frame(gene, cancer) 放入 for 循环中)。

gene <- vector(length = 500, mode = "integer")
cancer <- vector(length = 500, mode = "integer")
# data <- data.frame(gene, cancer)

odd_withMutate <- vector(length = 20, mode = "numeric")
odd_noMutate <- vector(length = 20, mode = "numeric")
result <- data.frame(odd_withMutate, odd_noMutate)

for (i in 1:20) {
data <- data.frame(gene, cancer) # remaking data every time
# set.seed(12)
# set.seed(16)
set.seed(i)
random1 <- runif(500, min = 0, max = 1)
# set.seed(12)
# set.seed(16)
set.seed(i) # add this instruction
random2 <- runif(500, min = 0, max = 1)
for (j in 1:500) {
if (random1[j] < 0.39){
data[j,1] <- 1
}
if (random2[j] < 0.08){
data[j,2] <- 1
}
}
s1 <- sum(data$gene == 1 & data$cancer == 1) # has the mutated gene & has cancer
s2 <- sum(data$gene == 1 & data$cancer == 0)
s3 <- sum(data$gene == 0 & data$cancer == 1)
s4 <- sum(data$gene == 0 & data$cancer == 0)
result[i,]$odd_withMutate <- s1/s2
result[i,]$odd_noMutate <- s3/s4
}


[添加]

for与函数不同,循环没有自己的环境。
所以处理 for循环直接影响全局环境对象,例如您的 data .
部分覆盖了data全局 env 由 if 语句调用,并在下一个循环中引用。

这是我的简单例子;

data <- data.frame(gene = vector(length = 5, mode = "integer"))
keep_of_process <- list()

for(i in 1:2) {

set.seed(i)
random_val <- runif(5, 0, 1)

for(j in 1:5) {
if(random_val[j] < 0.39) {
data[j, 1] <- 1
}

keep_of_process[[i]] <- data.frame(random = random_val,
gene = data$gene)
}
}


do.call("cbind", keep_of_process) # just to merge process to show
# left is i = 1 and right is i = 2

random gene random gene
1 0.2655087 1 0.1848823 1
2 0.3721239 1 0.7023740 1
3 0.5728534 0 0.5733263 0
4 0.9082078 0 0.1680519 1
5 0.2016819 1 0.9438393 1

请参阅第 2 行。在 i = 2 中,random是0.7023740但基因是1(之前的结果保留)。

所以为了做你想做的事(根据我的理解),你需要重新制作 data (我的回答)或完全覆盖 data通过 if 语句,例如

if(random_val[j] < 0.39) {
data[j, 1] <- 1
} else {
data[j, 1] <- 0
}

关于r - 奇怪的 "changeable"导致 R 中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61283571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com