Хорошо, я тщательно пересмотрел этот ответ. Я думаю, что вместо того, чтобы объединять ваши данные и сравнивать счетчики в каждом бине, предложение, которое я похоронил в своем первоначальном ответе о подборе 2-мерной оценки плотности ядра и сравнении их, является гораздо лучшей идеей. Более того, в пакете ks Tarn Duong для R есть функция kde.test (), которая делает это легко, как пирог.
Проверьте документацию для kde.test для получения более подробной информации и аргументов, которые вы можете настроить. Но в основном это делает именно то, что вы хотите. Возвращаемое значение p - это вероятность генерации двух наборов данных, которые вы сравниваете в соответствии с нулевой гипотезой о том, что они были получены из одного и того же распределения. Таким образом, чем выше значение p, тем лучше соответствие между A и B. См. Мой пример ниже, где легко обнаружить, что B1 и A различны, но что B2 и A правдоподобно совпадают (как они были сгенерированы) ,
# generate some data that at least looks a bit similar
generate <- function(n, displ=1, perturb=1){
BV <- rnorm(n, 1*displ, 0.4*perturb)
UB <- -2*displ + BV + exp(rnorm(n,0,.3*perturb))
data.frame(BV, UB)
}
set.seed(100)
A <- generate(300)
B1 <- generate(500, 0.9, 1.2)
B2 <- generate(100, 1, 1)
AandB <- rbind(A,B1, B2)
AandB$type <- rep(c("A", "B1", "B2"), c(300,500,100))
# plot
p <- ggplot(AandB, aes(x=BV, y=UB)) + facet_grid(~type) +
geom_smooth() + scale_y_reverse() + theme_grey(9)
win.graph(7,3)
p +geom_point(size=.7)
> library(ks)
> kde.test(x1=as.matrix(A), x2=as.matrix(B1))$pvalue
[1] 2.213532e-05
> kde.test(x1=as.matrix(A), x2=as.matrix(B2))$pvalue
[1] 0.5769637
МОЙ ОРИГИНАЛЬНЫЙ ОТВЕТ НИЖЕ, УДЕРЖИВАЕТСЯ ТОЛЬКО ТОЛЬКО, ЧТО ЕСТЬ СЕЙЧАС ССЫЛКИ НА ЭТО ОТ ДРУГОГО, КОТОРОЕ НЕ ОЗНАЧАЕТ
Во-первых, могут быть и другие способы сделать это.
Justel и др. Предложили многовариантное расширение критерия пригодности по Колмогорову-Смирнову, которое, я думаю, можно использовать в вашем случае, чтобы проверить, насколько хорошо каждый набор смоделированных данных соответствует оригиналу. Я не мог найти реализацию этого (например, в R), но, возможно, я не выглядел достаточно сложно.
В качестве альтернативы может быть способ сделать это, подгоняя связку как к исходным данным, так и к каждому набору смоделированных данных, а затем сравнивая эти модели. Есть реализации этого подхода в R и других местах, но я не особенно знаком с ними, поэтому не пробовал.
Но для непосредственного решения вашего вопроса разумный подход. Несколько пунктов предлагают себя:
Если ваш набор данных больше, чем кажется, я думаю, что сетка 100 х 100 - это слишком много бинов. Интуитивно я могу представить, что вы пришли к выводу, что различные наборы данных более различны, чем просто потому, что точность ваших бинов означает, что у вас есть много бинов с небольшим количеством точек в них, даже когда плотность данных высока. Однако это в конечном итоге является предметом суждения. Я бы обязательно проверил ваши результаты с разными подходами к биннингу.
После того как вы выполнили сборку и преобразовали свои данные в (фактически) таблицу на случай непредвиденных обстоятельств с двумя столбцами и числом строк, равным количеству бинов (в вашем случае 10000), у вас возникает стандартная проблема сравнения двух столбцов отсчетов. Подойдет либо критерий хи-квадрат, либо подгонка к какой-либо модели Пуассона, но, как вы говорите, есть неловкость из-за большого числа нулевых отсчетов. Любая из этих моделей обычно подбирается путем минимизации суммы квадратов разности, взвешенной по обратной величине ожидаемого числа отсчетов; когда это приближается к нулю, это может вызвать проблемы.
Редактировать - остальная часть этого ответа я больше не считаю подходящим подходом.
Я думаю, что точный тест Фишера может оказаться бесполезным или неуместным в этой ситуации, когда предельные суммы строк в кросс-таблице не фиксированы. Это даст правдоподобный ответ, но мне трудно совместить его использование с его первоначальным выводом из экспериментального плана. Я оставляю оригинальный ответ здесь, чтобы комментарии и последующие вопросы имели смысл. Кроме того, все еще может быть способ ответить на желаемый подход ОП - объединение данных и сравнение элементов с помощью некоторого теста, основанного на средних абсолютных или квадратичных различиях. Такой подход все равно будет использовать Nграмм× 2
Nграмм× 2Nграмм
Я смоделировал некоторые данные, чтобы они немного походили на ваши, и обнаружил, что этот подход был довольно эффективным для определения того, какие из моих наборов данных "B" были сгенерированы из того же процесса, что и "A", а какие немного отличались. Конечно, более эффективно, чем невооруженным глазом.
- Nграмм× 2 таблицы сопряженности, это не имеет значения , что число точек в A отличается от тех , в B (хотя заметит , что она являетсяпроблема, если вы используете только сумму абсолютных разностей или квадратов, как вы изначально предлагали). Тем не менее, важно, что каждая из ваших версий B имеет разное количество баллов. В основном, большие наборы данных B будут иметь тенденцию возвращать более низкие значения p. Я могу придумать несколько возможных решений этой проблемы. 1. Вы можете уменьшить все ваши наборы данных B до одного размера (размер наименьшего из ваших наборов B), взяв случайную выборку такого размера из всех наборов B, которые больше этого размера. 2. Сначала вы можете подогнать двумерную оценку плотности ядра к каждому из ваших наборов B, а затем смоделировать данные из этой оценки, которые равны размерам. 3. Вы можете использовать какую-то симуляцию, чтобы выяснить отношение значений p к размеру и использовать это, чтобы «исправить» p-значения, которые вы получаете из описанной выше процедуры, поэтому они сравнимы. Возможно, есть и другие альтернативы. То, что вы сделаете, будет зависеть от того, как были сгенерированы данные B, насколько различны размеры и т. Д.
Надеюсь, это поможет.