繁体   English   中英

在 R 中绘制三个向量的最佳方法?

[英]Best Way to Plot three vectors in R?

对于每个变量 x 和 z,我都有一个长度为 10k 的向量。 对于 10k 中的每一个,我还使用logit和其他方法估计了倾向得分。 所以我有另一个包含预测倾向分数的向量。

我想将预测的倾向向量绘制为 3d 图形的高度以及 x 和 z 向量的函数(我想要类似表面的东西)。 这样做的最佳方法是什么? 我试着用scatter3d()plot3d库,它看起来非常糟糕。

示例数据: https : //www.dropbox.com/s/1lf36dpxvebd7kw/mydata2.csv?dl=0

更新答案

使用您提供的数据,我们可以将数据分箱,通过分箱获得平均倾向得分,并使用geom_tile 我在下面提供了代码。 更好的选择是使用xz向量(以及您预测的二元处理变量)拟合倾向评分模型。 然后,在xz值的完整网格上创建一个预测pz_p值的新数据框并绘制它。 我没有适合模型的二元处理变量,所以我没有生成实际的图,但代码看起来像这样:

# Propensity score model
m1 = glm(treat ~ x + z, data=dat, family=binomial)

# Get propensity scores on full grid of x and z values
n = 100 # Number of grid points. Adjust as needed.
pred.dat = expand.grid(x=seq(min(dat$x),max(dat$x),length=n,
                       z=seq(min(dat$z),max(dat$z),length=n)
pred.dat$pz_p = predict(m1, newdata=pred.dat, type="response")

ggplot(pred.dat. aes(x, z, fill=pz_p)) +
  geom_tile() +
  scale_fill_gradient2(low="red", mid="white", high="blue", midpoint=0.5, limits=c(0,1))

带有分箱数据的瓦片图代码:

library(tidyverse)
theme_set(theme_classic())

dat = read_csv("mydata2.csv")

# Bin by x and z
dat = dat %>% 
  mutate(xbin = cut(x,breaks=seq(round(min(x),1)-0.05,round(max(x),1)+0.05,0.1),
                    labels=seq(round(min(x),1), round(max(x),1),0.1)),
         xbin=as.numeric(as.character(xbin)),
         zbin = cut(z,breaks=seq(round(min(z),1)-0.1,round(max(z),1)+0.1,0.2),
                    labels=seq(round(min(z),1), round(max(z),1),0.2)),
         zbin=as.numeric(as.character(zbin)))

# Calculate average pz_p by bin and then plot
ggplot(dat %>% group_by(xbin, zbin) %>% 
         summarise(pz_p=mean(pz_p)), 
       aes(xbin, zbin, fill=pz_p)) +
  geom_tile() +
  scale_fill_gradient2(low="red", mid="white", high="blue", midpoint=0.5, limits=c(0,1))

在此处输入图片说明

原答案

热图在这里可能很有效。 例如:

library(ggplot2)

# Fake data
set.seed(2)
dat = expand.grid(x=seq(0,10,length=100),
                  z=seq(0,10,length=100))  
dat$ps = 1/(1 + exp(0.3 + 0.2*dat$x - 0.5*dat$z))

ggplot(dat, aes(x, z, fill=ps)) +
  geom_tile() +
  scale_fill_gradient2(low="red", mid="white", high="blue", midpoint=0.5, limits=c(0,1)) +
  coord_equal()

在此处输入图片说明

或者在 3D 中使用rgl::persp3d

library(rgl)
library(tidyverse)

x=unique(sort(dat$x))
z=unique(sort(dat$z))
ps=dat %>% spread(z, ps) %>% select(-1) %>% as.matrix

persp3d(x, z, ps, col="lightblue")

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM