Как итеративно вычислить p-значения для t-теста

a) Сгенерируйте 50 значений из X ~ N (μX = 25, σX = 4) и 50 значений из Y ~ N (μY = 25, σY = 4). Используйте t-тест, чтобы проверить равенство средств.

c) Повторите часть (a) 2500 раз и сохраните p-значение для каждого из 2500 тестов. Каждое повторение должно генерировать новую выборку для x и новую выборку для y. НЕ ПЕЧАТЬ p-значения. НЕ ИСПОЛЬЗУЙТЕ петлю.

Я решил для части A одну выборку rnorm, но я не понимаю, с чего начать, чтобы получить 2500 разных случайных выборок x и 2500 разных случайных выборок y, чтобы получить 2500 разных p-значений.

Я также не знаю, как написать свой код, чтобы мой профессор получил те же ответы, что и я. Я попытался установить начальное значение, но это только делает все значения p одинаковыми, используя мой код выше.

# Part A

set.seed(1081)
x = rnorm(50,25,4)
y = rnorm(50,25,4)

t.test(x,y)

#Part B
#The p-value is 0.3752.
#We do not reject the null hypothesis.

#Part C

x1 = sample(x, 2500, replace = T)
y1 = sample(y, 2500, replace = T)
pval = sample(t.test(x1,y1)$p.value, 2500, replace = T)


person Ross Fosher    schedule 18.04.2019    source источник


Ответы (3)


Другой подход таков:

    library(MASS)       #load MASS library

    s <- 4*diag(2500)   #create the variance matrix for the simulation
    set.seed(123)        # seed to replicate results

    x <- mvrnorm( 50, m= rep(25,times=2500), Sigma=s)  #draw 50 values, 25000 times 

    y <- mvrnorm( 50, m = rep(25, times=2500), Sigma=s) #draw 50 values, 2500 times

    diff <- x - y

    test <- apply(diff,2,t.test) #do the t.tests

    names(test) #some of the results you can print

Если у вас есть вопросы по коду, вы можете задать их мне.

person ilias23    schedule 18.04.2019
comment
Почему мы берем разность x и y? - person Ross Fosher; 19.04.2019
comment
Когда вы хотите выполнить t-тест между двумя выборками (следовательно, x, y), это то же самое, чтобы проверить, равна ли их разница нулю. Таким образом, чтобы выполнить один t-тест, вы можете создать новую выборку z ( z = x-y) и выполнить тест t.test (z, mu = 0). Вы получите практически одинаковые результаты с двумя примерами теста t.test(x,y). - person ilias23; 20.04.2019

другая возможность - использовать replicate:

Обратите внимание, что вы должны установить случайное начальное число вне функции.

myfun <- function(){
  x <- rnorm(50, 25, 4)
  y <- rnorm(50, 25, 4)

  return(t.test(x, y)$p.value)
}


set.seed(1)
p_vals <- replicate(2500, myfun())
person Cettt    schedule 19.04.2019

Еще одна возможность:

set.seed(1081)
n <- 50
times <- 2500
x <- data.frame(matrix(rnorm(n*times, mean=25, sd=4), nrow=n))
y <- data.frame(matrix(rnorm(n*times, mean=25, sd=4), nrow=n))
pvals <- mapply(FUN = function(x,y) t.test(x,y)$p.value, x, y)
mean(pvals < .05)  # should be ~= .05

Одновременный цикл над двумя списками в R (комментарий Джого)

Но если мы буквально воспримем «каждое повторение должно генерировать новые образцы», ответ @Cettt может быть тем, что нужно.

person chan1142    schedule 19.04.2019