3d表面图与函数调用

时间:2017-02-16 00:14:31

标签: r ggplot2 3d

我想做一个表面图,其中z是对x和y评估的pwr.t.test函数的调用

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")

怎么办呢?

1 个答案:

答案 0 :(得分:2)

如果您只是想绘制所需的样本量,3D图可能有点过分。因此,首先是制作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现在要小得多,因为它不是不必要的重复。