Это моя цель: построить среднее значение z в соответствии с ячейками, образованными x и y в R - PullRequest
0 голосов
/ 13 ноября 2018

Итак, я наткнулся на этот ответ здесь, Как создать трехмерную гистограмму в R ,

, и мой вопрос: есть ли у меня три переменные и я хочу использовать x и y?чтобы создать ячейки, например, используя cut и table в другом ответе, как я могу затем отобразить z как среднее значение всех данных переменной Z, попадающих в эти ячейки?

Это то, что у меня есть

library(plot3D)

x <- data$OPEXMKUP_PT_1d
y <- data$prod_opex


z <- data$ab90_ROIC_wogw3

x_c <- cut(x, 20)
y_c <- cut(y, 20)
cutup <- table(x_c, y_c)
mat <- data.frame(cutup)


hist3D(z = cutup, border="black", bty ="g",
       main = "Data", xlab = "Markup",
       ylab ="Omega", zlab = "Star")

Но это показывает z как частоту, и когда я пытаюсь,

hist3D(x, y, z, phi = 0, bty = "g",  type = "h", main = 'NEWer',
       ticktype = "detailed", pch = 19, cex = 0.5,
       xlim=c(0,3),
       ylim=c(-10,20),
       zlim=c(0,1))

Он долго думает и выкидываетошибка,

Error: protect(): protection stack overflow
Graphics error: Plot rendering error

Хорошо подойдет 3dscatter, но данные не имеют смысла, поскольку переменная Z представляет собой отношение, которое в основном находится в диапазоне от 0 до 1, поэтому вы получаете кучу высоких линий ии куча коротких строк.Я бы хотел, чтобы они усреднялись по bin, чтобы показать, как меняется среднее отношение при изменении x и y.Пожалуйста, дайте мне знать, если есть способ сделать это.Спасибо!

1 Ответ

0 голосов
/ 13 ноября 2018

Не знаю точно, как выглядят ваши данные, поэтому я придумал некоторые.Вы должны быть в состоянии приспособиться к вашим потребностям.Это немного хакерский / грубый форс-мажор, но он может работать просто отлично, если ваши данные не слишком велики, чтобы замедлить цикл.

library(plot3D)

# Fake it til you make it
n = 5000
x = runif(n)
y = runif(n)
z = x + 2*y + sin(x*2*pi)

# Divide into bins
x_c = cut(x, 20) 
y_c = cut(y, 20) 
x_l = levels(x_c)
y_l = levels(y_c)

# Compute the mean of z within each x,y bin
z_p = matrix(0, 20, 20) 
for (i in 1:length(x_l)){
    for (j in 1:length(y_l)){
        z_p[i,j] = mean(z[x_c %in% x_l[i] & y_c %in% y_l[j]])
        }   
    }   

# Get the middle of each bin
x_p = sapply(strsplit(gsub('\\(|]', '', x_l), ','), function(x) mean(as.numeric(x)))
y_p = sapply(strsplit(gsub('\\(|]', '', y_l), ','), function(x) mean(as.numeric(x)))

# Plot
hist3D(x_p, y_p, z_p, bty = "g",  type = "h", main = 'NEWer',
       ticktype = "detailed", pch = 19, cex = 0.5)

По сути, мы просто вручную вычисляем среднюю высоту бинаz, перебирая бункеры.Может быть лучший способ сделать вычисление.

enter image description here

...