Estoy trabajando con el lenguaje de programación R. Estoy tratando de trazar algunos datos categóricos y continuos con los que estoy trabajando, pero obtengo un error que me dice que tales trazados solo son posibles con "solo variables numéricas".

library(survival)
library(ggplot2)

data(lung)
data = lung
data$sex = as.factor(data$sex)
data$status = as.factor(data$status)
data$ph.ecog = as.factor(data$ph.ecog)
str(data)

#plot
mycolours <- rainbow(length(unique(data$sex)), end = 0.6)
# png("gally.png", 500, 400, type = "cairo", pointsize = 14)
par(mar = c(4, 4, 0.5, 0.75))
plot(NULL, NULL, xlim = c(1, 5), ylim = range(data[, 1:6]) + c(-0.2, 0.2),
     bty = "n", xaxt = "n", xlab = "Variable", ylab = "Standardised value")
axis(1, 1:5, labels = colnames(data)[1:6])
abline(v = 1:5, col = "#00000033", lwd = 2)
abline(h = seq(-2.5, 2.5, 0.5), col = "#00000022", lty = 2)
for (i in 1:nrow(data)) lines(as.numeric(data[i, 1:6]), col = mycolours[as.numeric(data$sex[i])])
legend("topright", c("Female", "Male"), lwd = 2, col = mycolours, bty = "n")
# dev.off()

¿Alguien sabe si esto es posible hacer con datos categóricos y continuos?

Gracias

Fuentes: R: Trazado de coordenadas paralelas sin GGally

1
Noob 22 ene. 2021 a las 22:36

1 respuesta

La mejor respuesta

Sí. Solo debes tener cuidado con los valores. Recuerde cómo los factores se codifican internamente: son solo variables enteras picantes con etiquetas de valor (similares a los nombres). Puede convertirlo en caracteres o numéricos sin pérdidas. Por el bien de trazar, necesita números para las coordenadas de línea, por lo que la naturaleza factor-y de sus variables vendrá al final.

Recuerde que la calidad de su visualización y el contenido de la información depende del orden de sus variables en su conjunto de datos. Por factores, las etiquetas son absolutamente necesarias. ¡Ayude al lector haciendo algunas mejoras completamente personalizadas imposibles en ggplot2 en pequeños pasos!

Escribí una función personalizada que permitía a cualquiera agregar texto superlegible sobre los valores que no son tan obvios de interpretar. ¡Dé nombres significativos, elija el tamaño de fuente apropiado, pase todos esos parámetros adicionales a la función personalizada como puntos suspensivos (...)!

Aquí se puede ver que la mayoría de los pacientes fallecidos son mujeres y la mayoría de los censurados son hombres. Quizás agregar algunos puntos con un ligero jitter le dará al lector una idea acerca de las distribuciones de estas variables.

Gally plot with categorical variables

library(survival)
data(lung)
# Data preparation
lung.scaled <- apply(lung, 2, scale)
drop.column.index <- which(colnames(lung) == "sex")
lung.scaled <- lung.scaled[, -drop.column.index] # Dropping the split variable
split.var <- lung[, drop.column.index]
lung <- lung[, -drop.column.index]

mycolours <- rainbow(length(unique(split.var)), end = 0.6, v = 0.9, alpha = 0.4)
# png("gally.png", 500, 400, type = "cairo", pointsize = 14)
par(mar = c(5.5, 4, 0.5, 0.75))
plot(NULL, NULL, xlim = c(1, ncol(lung.scaled)), ylim = range(lung.scaled, na.rm = TRUE) + c(-0.2, 0.2),
     bty = "n", xaxt = "n", xlab = "", ylab = "Standardised value")
axis(1, 1:ncol(lung.scaled), labels = colnames(lung), cex.axis = 0.95, las = 2)
abline(v = 1:ncol(lung), col = "#00000033", lwd = 2)
abline(h = seq(round(min(lung.scaled, na.rm = TRUE)), round(max(lung.scaled, na.rm = TRUE), 0.5)), col = "#00000022", lty = 2)
for (i in 1:nrow(lung.scaled)) lines(as.numeric(lung.scaled[i, ]), col = mycolours[as.numeric(split.var[i])])
legend("topleft", c("Female", "Male"), lwd = 3, col = mycolours, bty = "n")

# Labels for some categorical variables with a white halo for readability
labels.with.halo <- function(varname, data.scaled, labels, nhalo = 32, col.halo = "#FFFFFF44", hscale = 0.04, vscale = 0.04, ...) {
  offsets <- cbind(cos(seq(0, 2*pi, length.out = nhalo + 1)) * hscale, sin(seq(0, 2*pi, length.out = nhalo + 1)) * vscale)[-(nhalo + 1), ]
  ind <- which(colnames(data.scaled) == varname)
  yvals <- sort(unique(data.scaled[, ind]))
  for (i in 1:nhalo) text(rep(ind, length(yvals)) + offsets[i, 1], yvals + offsets[i, 2], labels = labels, col = col.halo, ...)
  text(rep(ind, length(yvals)), yvals, labels = labels, ...)
}

labels.with.halo("status", lung.scaled, c("Censored", "Dead"), pos = 3)
labels.with.halo("ph.ecog", lung.scaled, c("Asymptomatic", "Symp. but ambul.", "< 50% bed", "> 50% bed"), pos = 3, cex = 0.9)

# dev.off()
1
Andreï Kostyrka 24 ene. 2021 a las 02:02