Как создать график мощности теста в R?

Я хочу создать сравнение для нормального теста с методами Шапиро-Уилкса, Колмогорова-Смирнова, Андерсона-Дарлинга, Крамера фон Мизеса и Дана Скорректированные методы Ярке-Бера на основе мощности теста (1-бета) для размеров выборки n = 10,20 , 30,40 и 50.

testnormal=function(n,m,alfa)
{
require(nortest)
require(normtest)
require(xlsx)
pvalue=matrix(0,m,5)
decision=matrix(0,m,5)
for (i in 1:m)
{
data=runif(n,2,5)
test1=shapiro.test(data)
pv1=test1$p.value
pvalue[i,1]=pv1
if (pv1<alfa) 
{
decision[i,1]=1
}
test2=ks.test(data,"pnorm",mean=mean(data),sd=sd(data))
pv2=test2$p.value
pvalue[i,2]=pv2
if (pv2<alfa) 
{
decision[i,2]=1
}
test3=ad.test(data) 
pv3=test3$p.value
pvalue[i,3]=pv3
if (pv3<alfa) 
{
decision[i,3]=1
}
test4=cvm.test(data) 
pv4=test4$p.value
pvalue[i,4]=pv4
if (pv4<alfa) 
{ 
decision[i,4]=1
}
test5=ajb.norm.test(data) 
pv5=test5$p.value
pvalue[i,5]=pv5
if (pv2<alfa) 
{
decision[i,5]=1
}
}
result1=data.frame(pvalue)
result2=data.frame(decision)
colnames(result1)=c("SW","KS","AD","CvM","AJB")
colnames(result2)=c("SW","KS","AD","CvM","AJB")
write.xlsx(result1,"testnormal_pvalue.xlsx")
write.xlsx(result2,"testnormal_decision.xlsx")
one_min_beta=t(1-(colSums(decision)/m))
test.of.power=data.frame(one_min_beta)
colnames(test.of.power)=c("SW","KS","AD","CvM","AJB")
return(test.of.power)
}
simulation=testnormal(10,100,0.05)
simulation2=testnormal(20,100,0.05)
simulation3=testnormal(30,100,0.05)
simulation4=testnormal(40,100,0.05)
simulation5=testnormal(50,100,0.05)
output=rbind(simulation,simulation2,simulation3,simulation4,simulation5)
output

Я хочу построить график мощности теста, чтобы увидеть тенденции увеличения и уменьшения мощности теста в зависимости от размера выборки. Кто-нибудь может помочь, пожалуйста?


person Poltak Alvietra    schedule 24.04.2020    source источник


Ответы (1)


Я просмотрел ваш код и переписал его, чтобы лучше понять, чего вы хотите (для чего нужен Excel?). Я разбил его на более мелкие функции, чтобы вы могли лучше контролировать подобные исследования с помощью моделирования. Код не особо эффективен.

Но дает ли это вам то, что вы хотите?

library("nortest")
library("normtest")
library("dplyr")
library("ggplot2")

# Function for doing all tests and putting it into a data.frame
tests <- function(data) {
  list_of_tests <- list(
    SW = shapiro.test(data),
    KS = ks.test(data, pnorm, mean = mean(data), sd = sd(data)),
    AD = ad.test(data) ,
    CMV = cvm.test(data),
    AJB = ajb.norm.test(data)
  )
  # Combine to tibble
  res <- bind_rows(lapply(list_of_tests, unclass))
  res[c("method", "p.value")] # Keep only method and p-value cols
}
# Test it with e.g. 'tests(data = runif(8, 2, 5))'

# Function for repeated simulation and testing, combine results and derive power
testnormal <- function(n, m, alpha) {
  # Important that runif is inside replicate
  test_res <- 
    bind_rows(replicate(tests(data = runif(n, 2, 5)), n = m, 
              simplify = FALSE))

  test_of_powers <-
    test_res %>% 
    group_by(method)  %>% 
    summarize(power = mean(p.value < alpha)) %>% 
    mutate(n = n, m = m, alpha = alpha)
    
  return(test_of_powers)
}

# Repeat over a number of simulations:
sims <- expand.grid(n = c(10, 20, 30, 40, 50),
                    m = 1000,
                    alpha = 0.05)

output <- bind_rows(
  mapply(testnormal, n = sims$n, m = sims$m, alpha = sims$alpha,
         SIMPLIFY = FALSE)
)

Собственно делаю сюжет:


# Plot it
ggplot(output, aes(x = n, y = power, col = method)) +
  geom_line()

введите описание изображения здесь

Этот способ должен упростить построение графиков, а также моделирование других сеток значений (например, с изменяющейся альфой) или расширить диапазон n и т. Д.

person Anders Ellern Bilgrau    schedule 24.04.2020
comment
Вот результат на моем компьютере: Error in UseMethod("depth") : no applicable method for 'depth' applied to an object of class "NULL" Error in grid.Call.graphics(C_upviewport, as.integer(n)) : cannot pop the top-level viewport ('grid' and 'graphics' output mixed?) Сюжет, кстати, отличный. Но в любом случае мне нужно создать таблицу, чтобы увидеть сравнение этих методов в соответствии с размером выборки. - person Poltak Alvietra; 25.04.2020
comment
Когда возникает эта ошибка? Я думаю, вам нужно запустить его в чистом сеансе R и опубликовать вывод sessionInfo(). Что касается таблицы, предположим, что все, что вы хотите, содержится в объекте output. - person Anders Ellern Bilgrau; 25.04.2020