R - одномерная «тепловая карта» для категориальных переменных - PullRequest
0 голосов
/ 24 февраля 2019

Хотите создать стек 1D тепловых карт, которые:

  1. показывают центральность (например, среднее значение, представленное выделением )
  2. показывают дисперсию (например, стандартное отклонение, представленное оценкой )

Примечание: центральность или дисперсия не зависят от размеров выборки.Длина столбца должна быть постоянной для каждой переменной, размеры выборки не являются (обязательно).

Например, как это могло бы выглядеть

enter image description here

Вот минимальный пример похожих переменных:

library(plyr)

v1 <- c("yes", "rather no", "yes", "yes", "yes", "rather yes", "rather yes", "rather no", "rather no", "no", "no", "no")
(v1 <- factor(v1, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)) # order factor values & show
# now, one variant how to re-code/transform the _ordered_ factors as/to values
# (you may have a better proposal/oppinion)
(v1n <- sapply(v1, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))) # re-code to numeric & show
(v1n.mean <- mean(v1n)) # calculate mean & show
(v1n.sd   <- sd(v1n))   # calculate standard deviation & show

v2 <- c("rather yes", "rather yes", "rather no", "rather no", "rather no", "rather no", "rather no", "rather no", "rather no")
v2 <- factor(v2, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)
v2
v2n <- sapply(v2, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))
v2n
(v2n.mean <- mean(v2n))
(v2n.sd   <- sd(v2n))

v3 <- c("yes", "yes", "yes", "rather yes", "rather yes", "rather yes", "rather no", "no")
v3 <- factor(v3, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)
v3
v3n <- sapply(v3, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))
v3n
(v3n.mean <- mean(v3n))
(v3n.sd   <- sd(v3n))

1 Ответ

0 голосов
/ 24 февраля 2019

Обновленный ответ:
Этот ответ был обновлен, поскольку
1. Изменены данные v1, v2, v3 в вопросе и
2. метки для трех столбцов.были добавлены

Верхняя часть по-прежнему в основном оригинальный ответ.Ниже приведен новый ответ в ответ на разъяснения из ОП.

Оригинальный ответ в основном
Вот что-то вроде того, что вы просите.Тем не менее, не может показать центральную тенденцию, где ничего не существует.После того, как мы посмотрим на графики, я расскажу об этом немного подробнее.После того, как мы посмотрим на графики, я расскажу об этом немного подробнее.

Идея состоит в том, чтобы создать пустой график и затем нарисовать полосу серого для каждой переменной (v1, v2, v3).Место на графике с наименьшим количеством ответов будет черным.Область с наибольшим количеством ответов будет белой.Между ними уровень серого будет масштабироваться пропорционально количеству ответов.

## To make it easy to refer to the different variables
Responses = list(v1,v2,v3)

## 100 colors to allow for a lot of continuity
## color 1 is black, color 100 is white
GrayScale = gray.colors(100, start=0.05, end=0.97)

## Make a blank plot
plot(NULL, type="n", xlab="", ylab="", bty="n", xaxt="n", yaxt="n",
    xlim=c(1,4), ylim=c(1,length(Responses)+1))

## Plot all of the bars
for(j in 1:length(Responses)) {
    Tab = table(Responses[[j]])
    Tab = round(99*(Tab-min(Tab))/(max(Tab)-min(Tab)))+1
    x = seq(1,4,0.01)
    Density = round(approx(1:4, Tab , x)$y)

    ## Make a smooth looking bar
    for(i in 1:(length(x)-1))  {
        polygon(c(x[i],x[i],x[i+1],x[i+1]), c(j,j+0.75,j+0.75,j), 
            col=GrayScale[Density[i]], border=NA)
    }
}
## Add labels
text(1:4, 4, levels(v1))
axis(2, at=(1:3)+0.4, labels=c("v1", "v2", "v3"), lwd=0, lwd.ticks=1, las=1)

Barplot based on distribution of data

Ответ на измененный вопрос
Этот ответ только строит графики распределения Гаусса, используяСредние значения и стандартные отклонения, которые вы рассчитали.Гауссианы построены в стиле предыдущего ответа, с белым для среднего, а точка, наиболее удаленная от среднего, - черная.

Means = c(v1n.mean, v2n.mean, v3n.mean)
SD    = c(v1n.sd, v2n.sd, v3n.sd)

## 100 colors to allow for a lot of continuity
## color 1 is black, color 100 is white
GrayScale = gray.colors(100, start=0.05, end=0.97)

## Make a blank plot
plot(NULL, type="n", xlab="", ylab="", bty="n", xaxt="n", yaxt="n",
    xlim=c(1,4), ylim=c(1,length(Responses)+1))

for(j in 1:length(Responses)) {
    x = seq(1,4,0.03)
    y = dnorm((x-1)/3, Means[j], SD[j])
    y = round(99*(y-min(y))/(max(y)-min(y))) + 1

    for(i in 1:(length(x)-1))  {
        polygon(c(x[i],x[i],x[i+1],x[i+1]), c(j,j+0.75,j+0.75,j), 
            col=GrayScale[y[i]], border=NA)
    }
}
## Add labels
text(1:4, 4, levels(v1))
axis(2, at=(1:3)+0.4, labels=c("v1", "v2", "v3"), lwd=0, lwd.ticks=1, las=1)

Barplot from Gaussians

...