2016-09-01 2 views
1

Я пытаюсь сделать Heatmaps в R. В принципе, есть два опроса, и я пытался сопоставить, ответил ли кто-либо или не ответил на вопрос. Я был в состоянии сделать один для следующих используя код, приведенный ниже:Ошибка с Heatmap в R

x1 <- c(0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
x2 <- c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1) 
x3 <- c(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) 
x4 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
x5 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
x6 <- c(0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0) 

x <- rbind(x1, x2, x3, x4, x5, x6) 
hv <- heatmap(t(x), col = c("Forestgreen", "Darkorange2"), margins = c(4, 12), Colv = NA, Rowv = NA, scale = "column", xlab ="Person", ylab ="", main = "", labCol=c("1", "2", "3", "4", "5", "6")) 
legend("topright", c("Non-Missing", "Missing"), col=c("Forestgreen", "Darkorange2"), bty="n", fill=c("Forestgreen", "Darkorange2")) 

Хотя Heatmap Образующийся хорошо, один я пытаюсь создать для второго опроса выключен. См. Код ниже:

y1 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0) 
y2 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
y3 <- rep(c(0, 1), c(34, 2)) 
y4 <- c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y5 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0) 
y6 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y7 <- rep(c(0, 1), each=18) 
y8 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y9 <- c(0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1) 
y10 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y11 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y12 <- c(0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
y13 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0) 


y <- rbind(y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13) 
hv <- heatmap(t(y), col = c("Forestgreen", "Darkorange2"), margins = c(4, 12), Colv = NA, Rowv = NA, scale = "column", xlab ="Person", ylab ="", main = "") 
legend("topright", c("Non-Missing", "Missing"), col=c("Forestgreen", "Darkorange2"), bty="n", fill=c("Forestgreen", "Darkorange2")) 

Я не понимаю, почему существует белая линия, по существу, по оси y2. Особенно, когда не было проблем с первым. Любое понимание было бы полезно. Благодаря!

+1

Проблема в том, что второй столбец имеет значения, которые являются всеми 1.В результате, я думаю, что функция не знает, как назначить цвета, потому что нет никакой разницы в тепловой карте. Мне нужно немного погрузиться в функцию. В качестве доказательства измените одно из значений в y2 на 0, и оно будет выглядеть нормально. – TARehman

ответ

0

Как отмечено в комментарии, проблема здесь заключается в том, что значения в y2 все 1. Вы поручили функцию heatmap от масштаба на основе значений столбцов (scale = "column"). Поскольку во втором столбце нет различия, нет ничего, чтобы масштабировать, и поэтому вы просто ничего не возвращаете. Функция heatmap должна, вероятно, выбросить ошибку или предупреждение об этом, но по какой-то причине она этого не делает.

Хорошей новостью является то, что это простое решение. Если вы измените масштабирование от «column» до «none», проблема будет решена. На самом деле, интересно, другие столбцы, когда scale = "column" также ошибочны - я не уверен, почему, особенно, поскольку проблема исчезает, когда вы вводите отклонение в y2.

y1 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0) 
y2 <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
y3 <- rep(c(0, 1), c(34, 2)) 
y4 <- c(0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y5 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0) 
y6 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y7 <- rep(c(0, 1), each=18) 
y8 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y9 <- c(0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1) 
y10 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y11 <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 
y12 <- c(0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) 
y13 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0) 

y <- rbind(y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13) 

hv <- heatmap(t(y), col = c("Forestgreen", "Darkorange2"), margins = c(4, 12), Colv = NA, Rowv = NA, scale = "none", xlab ="Person", ylab ="", main = "") 
legend("topright", c("Non-Missing", "Missing"), col=c("Forestgreen", "Darkorange2"), bty="n", fill=c("Forestgreen", "Darkorange2")) 

помощь на scale аргумента в heatmap состояния:

символ, указывающий, если значения должны быть центрированы и масштабирование в либо направлении строки или направлении столбца, или ни. По умолчанию является «строкой», если symm false, и «none» в противном случае.

Центрирование и масштабирование на столбца или строки осуществляется с помощью этого кода из функции heatmap:

else if (scale == "column") { 
    x <- sweep(x, 2L, colMeans(x, na.rm = na.rm), check.margin = FALSE) 
    sx <- apply(x, 2L, sd, na.rm = na.rm) 
    x <- sweep(x, 2L, sx, "/", check.margin = FALSE) 
} 

Используя некоторые меньший пример данных делает хорошую демонстрацию.

x1 <- c(1,2,3) 
x2 <- c(4,5,4) 
x3 <- c(1,1,1) 

data_mat <- cbind(x1,x2,x3) 
print(data_mat) 
    x1 x2 x3 
[1,] 1 4 1 
[2,] 2 5 1 
[3,] 3 4 1 
data_mat <- sweep(x = data_mat,MARGIN = 2,STATS = colMeans(data_mat)) 
print(data_mat) 
    x1 x2 x3 
[1,] 1 4 1 
[2,] 2 5 1 
[3,] 3 4 1 
sd_data_mat <- apply(X = data_mat, MARGIN = 2, FUN = sd) 
print(sd_data_mat) 
    x1   x2 x3 
[1,] -1 -0.3333333 0 
[2,] 0 0.6666667 0 
[3,] 1 -0.3333333 0 
data_mat <- sweep(x = data_mat,MARGIN = 2,STATS = sd_data_mat,FUN = "/") 
print(data_mat) 
    x1   x2 x3 
[1,] -1 -0.5773503 NaN 
[2,] 0 1.1547005 NaN 
[3,] 1 -0.5773503 NaN 

Вы можете видеть, что в , вы в конечном итоге с NaN, как вы делите 0 на 0. Это заканчивает тем, что прошло для построения позже, что приводит к тому, столбец отсутствует.

0

Когда Heatmap применяется масштабированием второго столбца имеет все NaN, вы можете проверить, что:

y_scaled <- scale(t(y)) 

Это происходит потому, что нет дисперсии там (т.е. всех наблюдений 1)

Один из способов исправить это искусственно вход некоторые данные там,

y_scaled[is.nan(y_scaled)] <- 1 

hv <- heatmap(y_scaled, col = c("Forestgreen", "Darkorange2"), margins = c(4, 12), Colv = NA, Rowv = NA, scale = "none", xlab ="Person", ylab ="", main = "") 

Тем более, что это выглядит, как вы хотите, чтобы отобразить простой 1/0 категориальной переменной.

+0

Применение 'scale (y)' не приводит к какому-либо 'NaN', поскольку он масштабирует всю матрицу сразу. Я думаю, вам нужно показать его, масштабируя каждый столбец за раз. – TARehman

+0

Предполагалось, что это будет масштаб (t (y)). В моем коде, который создает NaN во втором столбце. –

+0

Конечно, я должен был это заметить сам. Сожалею. :) – TARehman

Смежные вопросы