Создание тепловой карты на основе данных о смертности?

У меня есть два формата моих данных о смертности, один в виде списка, который вы получаете из базы данных о человеческой смертности, с мужскими, женскими и комбинированными данными в столбцах. Другой формат разделен на мужские и женские матрицы, где в каждой матрице указаны только возраст, год и коэффициент смертности.

Первый формат по линиям

Year Age   Female     Male    Total  
1961  99     0.3       0.4     0.3  
1961  98     0.4       0.5     0.4  

и т.п.

Второй формат я разделил, чтобы получить данные в виде:

 Age 1961  1962  1963 .....  
  0  0.02  0.02  0.02 ...  
  1  0.002 0.002 0.002....  

и т.п.

Я хотел бы иметь возможность построить тепловую карту, чтобы я мог смотреть на эффекты когорты и т. Д.

Я пробовал различные методы, найденные при поиске в Интернете, но они не работают с тем, как представлены мои данные. Тепловые карты, которые я создал, оказались полностью красными. Кто-нибудь может помочь?

Я пробовал это:

rnames <- France[,1]   #assign labels in column 1 to "rnames"
mat_data <- data.matrix(France[,2:ncol(France)])
rownames(mat_data) <- rnames #assign row names
col_breaks = c(seq(-1,0,length=100),  # for red
  seq(0,0.8,length=100),              # for yellow
  seq(0.8,1,length=100))              # for green
my_palette <- colorRampPalette(c("red", "yellow", "green"))(n = 299)
png("location",    # create PNG for the heat map        
  width = 5*300,        # 5 x 300 pixels
  height = 5*300,
  res = 300,            # 300 pixels per inch
  pointsize = 8)        # smaller font size

heatmap.2(mat_data,
cellnote=mat_data,
main="Correlation",
notecol="black",
trace="none",
margins =c(12,9),
col=my_palette,
breaks=col_breaks,
dendrogram="row",
Colv="NA")
dev.off()

При этом создается сплошная красная тепловая карта с годом, указанным внизу, а затем словом «возраст» рядом с годами, а затем фактическим возрастом, указанным по оси y. Это также дает мне код ошибки:

Error in seq.default(min.raw, max.raw, by = min(diff(breaks)/4)) : 
invalid (to - from)/by in seq(.)

Кто-нибудь знает, как лучше создать тепловую карту или что я здесь сделал не так?


person Emma    schedule 04.11.2015    source источник
comment
Прочтите Как спросить и как создать воспроизводимый пример на R. Сюда входят (некоторые) данные, предпочтительно вывод вызова dput и ваш собственный код.   -  person Heroka    schedule 04.11.2015
comment
@Heroka Я не был уверен, что включить, потому что весь код, который я пробовал, был очень длинным и так сильно не удался?   -  person Emma    schedule 04.11.2015
comment
Нам нужно увидеть хотя бы пример данных и то, что вы пробовали. Если что-то не получается, нам нужно увидеть, где и в чем ошибка.   -  person Tgsmith61591    schedule 04.11.2015
comment
@Emma хоть какие-то данные нужны. Если вы уже пробовали много кода, вам, конечно, не нужно публиковать его весь, но, может быть, это была последняя попытка?   -  person Heroka    schedule 04.11.2015
comment
@Heroka Сейчас я включил свою ближайшую попытку, я скоро добавлю образец данных! Не уверен, что разрешено из-за законов об авторском праве и т. Д., Хотя   -  person Emma    schedule 04.11.2015
comment
Какая линия его разрывает? R не нравится одна из ваших seq функций, но три, которые я вижу здесь, отлично работают с моей стороны. Есть ли в коде что-то, что не показано?   -  person Tgsmith61591    schedule 04.11.2015
comment
@Emma, ​​вы также можете публиковать смоделированные данные, если авторские права вызывают озабоченность. Если вы это сделаете, убедитесь, что типы / имена переменных совпадают.   -  person Heroka    schedule 04.11.2015
comment
А есть ли у вас пример того, что вы хотите получить?   -  person Heroka    schedule 04.11.2015
comment
@ Tgsmith61591 это строка Colv="NA", она принимает мои seq функции нормально, я думаю   -  person Emma    schedule 04.11.2015
comment
@Heroka momentumpublishing.co.uk/weknow0.co.uk/wp/wp-content/uploads/, похожий на этот   -  person Emma    schedule 04.11.2015
comment
Значит, вам не нужна дендрограмма, которую в настоящее время создает ваш код?   -  person Heroka    schedule 04.11.2015
comment
@EmmaThomas это строка Colv="NA", потому что это конец вызова функции для heatmap.2, поэтому ошибка находится в одном из аргументов, переданных функции ... один из многих-многих переданных аргументов :-)   -  person Tgsmith61591    schedule 04.11.2015
comment
@Heroka не совсем, в то время больше просто следовало коду. Я вытащу это!   -  person Emma    schedule 04.11.2015
comment
@Heroka оказывается, я не могу просто удалить его! что это должно быть вместо этого?   -  person Emma    schedule 04.11.2015
comment
@ Tgsmith61591 так что мне делать, извините? Довольно новичок в R, так что меня все это сбивает с толку!   -  person Emma    schedule 04.11.2015
comment
@Emma, ​​ваш ожидаемый результат имеет ось x для года и ось y для возраста, поэтому для меня это выглядит совсем не так, как график, создаваемый вашим кодом (со столбцами)   -  person Heroka    schedule 04.11.2015
comment
@EmmaThomas, что у вас в France фрейме?   -  person Tgsmith61591    schedule 04.11.2015
comment
@ Герока, я знаю! Вот в чем проблема! Я понятия не имею, как делать то, к чему я пытаюсь добраться!   -  person Emma    schedule 04.11.2015
comment
@ Tgsmith61591 первая таблица, которую я дал, я также пробовал ее для второй таблицы   -  person Emma    schedule 04.11.2015


Ответы (2)


Это хоть как-то полезно? Я основал его на том, как выглядят ваши данные, и сгенерировал некоторые данные для сопоставления. Затем я начал с графика с «годом» по оси x и «возрастом» по оси y и квадратом (geom_tile) для каждой точки. Эти квадраты окрашены в соответствии с «общим количеством». В нем нет многоугольников, как в приведенном вами примере, но я думаю, что с вашими реальными данными он позволит вам искать эффекты когорты.

#generate some data ranging from 0 to 0.1
set.seed(1000)
France <- expand.grid(Year=1961:2000,Age=20:98)
France$Female <- runif(nrow(France),0,0.05)
France$Male <- runif(nrow(France),0,0.05)
France$Total <- France$Male + France$Female


library(ggplot2)

p1 <- ggplot(France, aes(x=Year,y=Age,fill=Total)) + 
  geom_tile()+ 
  scale_fill_gradientn(colours=rainbow(10))
p1

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

person Heroka    schedule 04.11.2015
comment
хорошо, я попытался запустить код для своих данных, но он говорит Error in eval(expr, envir, enclos) : object 'year' not found, год взят из моих данных? Я пробовал France$year и то же самое по возрасту и общему количеству, но получилось Error in exists(name, envir = env, mode = mode) : argument "env" is missing, with no default, вы знаете, что это значит? - person Emma; 04.11.2015
comment
Это означает, что я небрежно использую заглавные буквы. Исправлю (я использовал имена переменных без заглавных букв). - person Heroka; 04.11.2015
comment
о, но это именно то, чего я хочу! - person Emma; 04.11.2015
comment
теперь это прекрасно работает, спасибо! Какие есть варианты с цветовой схемой, она выходит очень красной из-за большинства показателей смертности от 0 до 0,1! Думаю, вы мало что можете с этим поделать. Вроде 0-0,1 красный, как и выше 0,45? - person Emma; 04.11.2015
comment
Моя ошибка, я использовал неправильный вызов scale_gradientn, основанный на другой идее решения (которая была ложной). С ним можно поиграться, использовать разные цвета. - person Heroka; 04.11.2015
comment
Если это сработает для вас, не могли бы вы принять это? Не дает другим тратить на это время. - person Heroka; 04.11.2015

Из исходного кода:

z <- seq(min.raw, max.raw, by=min(diff(breaks)/4))

Код heatmap.2 внутренне вызывает функцию seq и выдает ошибку, с которой вы столкнулись:

Error in seq.default(min.raw, max.raw, by = min(diff(breaks)/4)) : 
    invalid (to - from)/by in seq(.)

Но что такое min.raw и max.raw? Прокрутите немного вверх (строка 640), и вы увидите, что это min и max переданного вами breaks arg (который в данном случае равен -1 и 1 соответственно). Параметр by во внутренней функции seq принимает значение 0:

min(diff(breaks)/4)

Фактически, вы можете воспроизвести эту ошибку, если попытаетесь построить seq функцию со следующими параметрами:

> seq(-1, 1, by=0)
Error in seq.default(-1, 1, by = 0) : invalid (to - from)/by in seq(.)

Здесь есть два следствия: во-первых, вы обнаружили угловой случай, который нарушает этот код, и это ошибка, о которой, вероятно, следует сообщить в репозиторий github (т. е. если это значение равно 0, используйте некоторый предопределенный параметр by). Во-вторых, вы можете использовать единый параметр break или просто не определять его. В конце концов, это необязательный параметр. Из документации:

breaks
(optional) Either a numeric vector indicating the splitting points for binning x
into colors, or a integer number of break points to be used, in which case the break
points will be spaced equally between min(x) and max(x).

Если оставить breaks пустым или указать одно значение, вы не должны столкнуться с этой проблемой.

person Tgsmith61591    schedule 04.11.2015
comment
Большое спасибо, когда вы говорите оставить breaks пустым, что именно вы имеете в виду? установить breaks=0, оставить поле пустым или удалить? Или что-то целиком? - person Emma; 04.11.2015
comment
Просто полностью удалите breaks=col_breaks из вызова. Так что это будет: heatmap.2(mat_data, cellnote=mat_data, main="Correlation", notecol="black", trace="none", margins =c(12,9), col=my_palette, dendrogram="row", Colv="NA") Попробуйте и посмотрите, что произойдет. - person Tgsmith61591; 04.11.2015
comment
Больше нет вывода? Я пробовал делать p <- heatmap.2(mat_data, cellnote=mat_data, main="Correlation", notecol="black", trace="none", margins =c(12,9), col=my_palette, dendrogram="row", Colv="NA"), а потом делать p, но тут просто приходит кучу цифр! - person Emma; 04.11.2015