我想做一个表面图,其中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")
怎么办呢?
答案 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()
给出
现在,如果您真的想要3D版本,可以使用plotly
来实现:
plot_ly(
x = x
, y = y
, z = z
, type = 'surface')
给出
请注意,制作的版本是互动的。
或plot3D
:
M <- mesh(x,y)
surf3D(
x = M$x
, y = M$y
, z = z
)
给出
请注意M
现在要小得多,因为它不是不必要的重复。