Как создать вектор при использовании For Loop?

Я пытаюсь провести двусторонний знаковый тест из 10 000 случайных нормальных выборок размером 30. Я пытаюсь извлечь p-значения, данные из binom.test, и поместить их в вектор, но не могу понять, как выполнить это.

set.seed(100)
sample <- matrix(rnorm(300000, mean=0.1, sd=1), 10000, 30)

success <- ifelse(sample>=0, 1, 0)
success

#sample[1,]
#success[1,]
#sum(success[1,])
#for loop
for(i in 1:10000){
        pvalue<- binom.test(sum(success[i,]), 30, p=0.5, 
                             alternative = c("two.sided"), 
                             conf.level = 0.95)$p.value
        p_values_success <- ifelse(pvalue<=0.05, 1, 0)
}

person Andy Radisavljevic    schedule 21.08.2019    source источник


Ответы (2)


Я думаю, что вы пытаетесь сделать, это

pvalue <- numeric(length = 1000L)
p_values_success <- numeric(length = 1000L)

for(i in 1:10000) {
  pvalue[i] <- binom.test(sum(success[i,]), 30, p=0.5, 
                  alternative = c("two.sided"), 
                  conf.level = 0.95)$p.value
  p_values_success[i] <- ifelse(pvalue[i]<=0.05, 1, 0)
}

Однако, если бы мне пришлось полностью переписывать код с нуля, я бы сделал

set.seed(100)
sample <- matrix(rnorm(300000, mean=0.1, sd=1), 10000, 30)
success[] <- as.integer(sample >=0)

t(apply(success, 1, function(x)  {
    p_val <- binom.test(sum(x), 30, p=0.5,alternative = c("two.sided"),
             conf.level = 0.95)$p.value
    c(p_val, as.integer(p_val<=0.05))
}))

Это вернет матрицу с двумя столбцами, где 1-й столбец — pvalue, а второй — p_values_success.

person Ronak Shah    schedule 21.08.2019

Вы также можете сделать:

apply(success, 1, 
      FUN = function(x) 
        ifelse(
          binom.test(sum(x), 30, p = 0.5, 
                     alternative = "two.sided", conf.level = 0.95)$p.value <= 0.05, 1, 0
          )
      )
person MKa    schedule 21.08.2019