#r #linkage #record-linkage
#r #привязка #привязка записи
Вопрос:
Я следую превосходному руководству по RPubs, в котором используется великолепный пакет привязки записей. Я применяю это к своим собственным данным, но я просто воспользуюсь руководством, чтобы объяснить свою проблему.
В двух наборах данных для сравнения есть ряд общих полей, используемых в привязке:
patents <- patents[,c("seq", "firstname", "lastname", "city", "state", "organization")]
nsf <- nsf[, c("InvestigatorId", "FirstName", "LastName", "CityName", "StateCode", "Name")]
names(nsf) <- names(patents)
Затем эти поля сравниваются с помощью функции compare.linkage():
a <- compare.linkage(nsf, patents, blockfld = c("state"), strcmp = T, exclude=c(1))
Это создает большой объект RecLinkData с именем ‘a’, который содержит множество пар сравнения.
Следующим шагом является вычисление весов M и U (весов согласования) с использованием алгоритма максимизации математического ожидания (EM):
b <- emWeights(a, cutoff = 0.8)
Я думаю, что это в основном создает общий вес соглашения, который является произведением всех отдельных связующих переменных.
Мой вопрос в том, как я могу добавить важность для одной из отдельных связующих переменных?
Так, например, я мог бы знать, что поле «фамилия» является надежным и точным в обоих наборах данных, поэтому, если фамилия точно согласована, то для придания этому большего веса в общей оценке соответствия.
Даже некоторые указания на то, где искать, были бы полезны, я немного запутался в этом и даже не знаю, что предпринять с точки зрения кода.
Ответ №1:
Вы не можете вводить дополнительную информацию в emWeights()
, за исключением, может быть, cutoff =
, которая принимает единственное значение или вектор с той же длиной, что и количество атрибутов. Таким образом, вы можете выбрать высокое cutoff
значение для атрибутов, которые, как вы знаете, являются точными, поэтому количество случайных совпадений будет сведено к минимуму.
Кроме этого, алгоритм EM в RecordLinkage не допускает дальнейшей настройки.
Однако существует epiWeights()
кулон, который вычисляет веса между 0
и 1
, используя оценочную частоту ошибок (по умолчанию e= 0.01
) и средние частоты значений в каждом поле (1/length(unique(all_values_in_a_field))
. Вы можете предоставить функции как вручную, так и таким образом настроить результаты.
Рассмотрим этот пример:
t1 <- data.frame(Vorname = c("Karl", "Fritz"), Name = c("Meister", "Schulz"), stringsAsFactors = F)
t2 <- data.frame(Vorname = c("Karl", "Fritz"), Name = c("Meister", "Schulze"), stringsAsFactors = F)
> epiWeights(linkage)$Wdata # e = 0.01
[1] 1.0000000 0.0000000 0.0000000 0.3855691
> epiWeights(linkage, e = c(0.01, 0.3)$Wdata
[1] 1.0000000 0.0000000 0.0000000 0.3120078
Если вы предполагаете более высокую частоту ошибок для поля Nachname
, он получает меньшие веса.