2017-02-16 8 views
1

Я хотел бы сделать поверхностный участок, где г является вызов функции pwr.t.test оцениваемой в точке х в у3d поверхность участка с вызовом функции

d = rep(seq(.05,.1,.01), length(seq(.2,.26,.01))) 
s = rep(seq(.2,.26,.01), length(seq(.05,.1,.01))) 
M =mesh(d,s) 
surf3D(x = M$x, 
     y = M$y, 
     z = pwr.t.test(d=M$x/M$y,power=.8,sig.level=.1,type="two.sample",alternative="two.sided")$n  , 
     colkey=FALSE, 
     bty="b2", 
     main="test") 

как это может быть сделано?

+0

Вы проверили, имеет ли выбранная функция значение в углах вашего прямоугольника 'x' и' y'? (Если этот 'pwr.t.test' из пакета pwr, это не так.) –

ответ

2

Если вы просто пытаетесь построить требуемый размер выборки, трехмерный график может немного переборщить. Итак, вот сначала это подход к простому созданию 2D-карты.

Сначала задайте значения X и Y. Обратите внимание, что они не должны быть введены несколько раз (например, с rep)

x <- seq(.05,.1,.01) 
y <- seq(.2,.26,.01) 

Затем мы можем создать пользовательскую функцию для расчета необходимого размера выборки для каждой комбинации (с использованием outer). Обратите внимание: размер эффекта, который вы рассчитали ранее, неверен. Размер эффекта: {mean(y) - mean(x) }/{sd(x)} (sd должен/мог включать y, см. here для получения более подробной информации о размерах эффекта). Итак, здесь, я предполагаю, что ваше стандартное отклонение равно 1, хотя я заметил, где вы можете это сделать. Функции pwr также не похожи на воспроизведение с векторами, поэтому я перебираю каждое значение по отдельности.

getN <- function(x,y){ 
    sapply(1:length(x), function(idx){ 
    pwr::pwr.t.test(d= (y[idx] - x[idx]) #/SD??? 
        , power=.8, sig.level=.1 
        , type="two.sample", alternative="two.sided" 
    )$n 
    }) 
} 

Затем, используя outer для расчета размеров выборки для каждой комбинации. Я также хотел бы установить имена строк/столбцов, чтобы помочь следить за вещами

z <- outer(x, y, getN) 
row.names(z) <- x 
colnames(z) <- y 

дает

  0.2  0.21  0.22  0.23  0.24  0.25  0.26 
0.05 550.2098 483.6650 428.5144 382.2977 343.1846 309.7905 281.0524 
0.06 631.5180 550.2098 483.6650 428.5144 382.2977 343.1846 309.7905 
0.07 732.3030 631.5180 550.2098 483.6650 428.5144 382.2977 343.1846 
0.08 859.3212 732.3030 631.5180 550.2098 483.6650 428.5144 382.2977 
0.09 1022.5344 859.3212 732.3030 631.5180 550.2098 483.6650 428.5144 
0.1 1237.1243 1022.5344 859.3212 732.3030 631.5180 550.2098 483.6650 

Какая матрица, я полагаю, вы хотите построить.

Здесь я использую dplyr, чтобы превратить его в длинном формате и передать его в ggplot (и используя viridis для хорошей цветовой палитры, хотя другие работают отлично, а)

data.frame(z, check.names = FALSE) %>% 
    mutate(xVal = row.names(.)) %>% 
    gather(yVal, `Sample Size`, -xVal) %>% 
    ggplot(
    aes(x = xVal 
     , y = yVal 
     , fill = `Sample Size`)) + 
    geom_tile() + 
    viridis::scale_fill_viridis() 

дает

enter image description here

Теперь, если вы действительно хотите 3D-версию, вы можете использовать plotly для достижения этой:

plot_ly(
    x = x 
    , y = y 
    , z = z 
    , type = 'surface') 

дает

enter image description here

И заметьте, что образовавшаяся версия является интерактивным.

Или с plot3D:

M <- mesh(x,y) 

surf3D(
    x = M$x 
    , y = M$y 
    , z = z 
) 

дает

enter image description here

И заметьте, что M теперь гораздо меньше, потому что она не unneccesarily дублируется.