2016-08-08 6 views
2

У меня есть координаты данных в R, и я хотел бы определить распределение, где лежат мои точки. Все пространство точек представляет собой квадрат боковой длины 100.Создание 2D-бинов в R

Я хотел бы назначить точки на разные сегменты на квадрате, например округленные до ближайшего 5. Я видел примеры, используя cut и findinterval, но я Не знаю, как использовать это при создании 2d-бункера.

На самом деле, я хочу, чтобы это было сделано, это плавное распределение, поэтому между соседними областями сетки нет огромных прыжков.

Например (это просто означало, чтобы проиллюстрировать эту проблему):

set.seed(1) 
x <- runif(2000, 0, 100) 
y <- runif(2000, 0, 100) 
plot(y~x) 
points(x = 21, y = 70, col = 'red', cex = 2, bg = 'red') 

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

enter image description here

ответ

1

Вы можете получить данные о binned с помощью функции bin2 в библиотеке ash.

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

library(ash) 
bins <- bin2(cbind(x,y)) 
f <- ash2(bins, m = c(10,10)) 

image(f$x,f$y,f$z) 
contour(f$x,f$y,f$z,add=TRUE) 

Если вы хотите более гладкие Лари, вы можете попытаться увеличить аргумент m, который является вектором длины 2 управления параметрами сглаживания вдоль каждой переменной.

f2 <- ash2(bins, m = c(10,10)) 
image(f2$x, f2$y, f2$z) 
contour(f2$x,f2$y,f2$z,add=TRUE) 

Сравнить f и f2 enter image description here

Алгоритм биннинга реализован в Фортран и очень быстро.

+1

Между прочим, зола представляет собой эффективную с точки зрения вычислений альтернативу использованию kdes, которые обычно являются лучшими оценками плотности, чем методы на основе гистограммы. Просто стоит отметить логику мыслительного процесса. Также стоит учитывать, что большинство реализаций kde, которые бывают быстрыми, будут использовать оцененные оценки плотности. – shayaa

2

Если вы готовы использовать ggplot2, есть некоторые хорошие варианты.

ggplot(data.frame(x,y), aes(x,y)) + geom_bin2d() 

enter image description here

ggplot(data.frame(x,y), aes(x,y)) + stat_density2d(aes(fill = ..level..), geom = "polygon") 

enter image description here

Update: Для вычисления 2d биннинга, вы могли бы использовать 2d (двумерное) нормальное сглаживание плотности ядра:

library(KernSmooth) 
bins <- bkde2D(as.matrix(data.frame(x, y)), bandwidth = c(2, 2), gridsize = c(25L, 25L)) 

, который может также отображаться как

library(reshape2) 
ggplot(melt(bins$fhat), aes(Var1, Var2, fill = value)) + geom_raster() 

enter image description here

Объект bins содержит x и y значения и нормированную плотность fhat. Играйте с сеткой (количество точек сетки в каждом направлении) и полосу пропускания (сглаживание), чтобы получить то, что вам нужно.

+1

как я могу извлечь бункеры здесь? и вероятность, назначенная каждому бинду? – dimebucker91

+0

Обновленный ответ. –