Pembaruan2

set.seed(i) kedua harus diganti sebagai set.seed(i+1), atau apa pun seri acak baru lainnya. Jika tidak, s3 <- sum(data$gene == 0 & data$cancer == 1) akan selalu 0, karena angka yang lebih kecil dari 0.08 akan lebih kecil dari 0.39.

Saya tidak memperbaiki kode pertanyaan awal saya karena masalah ini tidak terkait dengan pertanyaan inti posting ini.

Perbarui

set.seed(i) ditambahkan dua kali karena ada dua generasi bilangan acak, yaitu random1 dan random2. Namun, hasil di antara operasi masih dapat berubah, yang aneh.

Latar Belakang:

Kode di bawah ini tentang rasio peluang. Tetapi titik fokusnya bukanlah statistik di sini. Sebaliknya, saya menemukan hasilnya berubah (!) di antara beberapa operasi yang sebenarnya sama (saya kira sebenarnya tidak, tetapi saya tidak dapat mengetahuinya).

Kode:

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    
}

Operasi yang berbeda:

Operasi #1:

Jika saya menjalankan kode di atas, baris ke-12 dari odd_noMutate di result akan menjadi 0, baris ke-16 adalah NaN. Kemudian saya mencoba melihat apa yang terjadi, jadi saya menggunakan set.seed(12) atau set.seed(16) untuk memeriksa (Operasi #2 & #3). Tapi 0 dan NaN menghilang! Maksud saya, dalam Operasi #2, 0.1638418 0 bukan 1.5075377 0. Dalam Operasi #3, 0.2830189 0 bukan 2.4013605 NaN.

Operasi #2:

Bagian kode yang diubah adalah:

  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)

Operasi #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

Operasi #4:

Saya menemukan bahwa bahkan mengubah i dalam kode saya akan membuat hasil yang sama sekali berbeda (Bukankah itu bagian dari hasil aslinya?). Ini adalah Operasi #4. Secara khusus, 0.3092105 0 bukan 1.5075377 0; 0.7562724 0 bukan 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)

Hasil di antara operasi ini ditunjukkan di bawah ini: Hasil r

3
T X 18 April 2020, 05:36

1 menjawab

Jawaban Terbaik

Masalahnya adalah bahwa beberapa nilai sebelumnya di data tetap ada dan digunakan kembali. Mungkin masalah Anda terpecahkan dengan membuat ulang data setiap for loop (i). (menempatkan data <- data.frame(gene, cancer) ke dalam for loop).

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    
}


[TAMBAHAN]

for loop tidak memiliki lingkungan sendiri tidak seperti fungsi.
Jadi penanganan dalam loop for secara langsung memengaruhi objek global env seperti data Anda.
Anda sebagian menimpa data Global env dengan pernyataan if dan itu dirujuk di loop berikutnya.

Berikut adalah contoh sederhana saya;

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

Silakan lihat baris 2. Dalam i = 2, random adalah 0,7023740 tetapi gen adalah 1 (hasil sebelumnya tetap).

Jadi untuk melakukan apa yang Anda inginkan (dari pemahaman saya), Anda perlu membuat ulang data (jawaban saya) atau sepenuhnya menimpa data oleh pernyataan if, seperti

if(random_val[j] < 0.39) {
      data[j, 1] <- 1
    } else {
      data[j, 1] <- 0
    }
2
cuttlefish44 21 April 2020, 03:31