Лучший способ построить три вектора в R?

У меня есть вектор длиной 10k для каждой из переменных x и z. Для каждого из 10 000 я также оценил показатели склонности, используя logit и другие методы. Итак, у меня есть другой вектор, который содержит предсказанные показатели склонности.

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

Пример данных: https://www.dropbox.com/s/1lf36dpxvebd7kw/mydata2.csv?dl=0


person user52932    schedule 30.05.2018    source источник
comment
Возможно пакет rgl.   -  person Rui Barradas    schedule 30.05.2018


Ответы (1)


Обновленный ответ

Используя предоставленные вами данные, мы можем объединить данные, получить средний показатель склонности по ячейкам и построить график с помощью geom_tile. Я предоставляю код для этого ниже. Лучшим вариантом было бы подобрать модель оценки склонности с использованием векторов x и z (и бинарной переменной обработки, которую вы прогнозируете). Затем создайте новый фрейм данных прогнозируемых значений pz_p в полной сетке значений x и z и постройте его. У меня нет вашей бинарной переменной обработки, с которой можно было бы подогнать модель, поэтому я не создал фактический график, но код будет выглядеть примерно так:

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

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

person eipi10    schedule 30.05.2018
comment
Так что мои x и z не отсортированы. Когда я использую код тепловой карты, цвет не создается. Я вижу только серые клетки. Что мне нужно, так это некоторая сетка и код для автоматического определения трех координат на сетке. Я не уверен, смогу ли я сортировать по x и z, потому что они являются непрерывными независимыми случайными величинами, поэтому, если x, скажем, по возрастанию, z может прыгать. Любые решения для этого? - person user52932; 31.05.2018
comment
persp3D необходимо отсортировать уникальные значения x и y (где z является аргументом y). Затем значения z (ваши оценки склонности) должны представлять собой матрицу, в которой заголовки столбцов представляют собой значения y (от самого низкого до самого высокого), а имена строк — значения x (от самого низкого до самого высокого), а каждое значение в матрице — это Значение PS при заданных значениях x и y. - person eipi10; 31.05.2018
comment
простите. Я пытаюсь использовать код ggplot вместо 3D-графика. Код для вашей тепловой карты создает серые плитки без цвета, и мне интересно, есть ли способ решить эту проблему. Я загружаю файл csv, содержащий мои данные, в основной пост. (добавил файл) - person user52932; 31.05.2018