Расстояние Хэмминга для сгруппированных результатов - PullRequest
0 голосов
/ 09 мая 2020

Я работаю с набором данных, который содержит 40 разных участников, по 30 наблюдений для каждого. Наблюдая за поведением поиска, я хочу рассчитать расстояние поиска для каждого предмета за раунд (от 1 до 30).

Чтобы сравнить мои данные с текущей литературой, мне нужно использовать расстояние Хэмминга для описания расстояний поиска.

Переменная называется Inputs и представляет собой строковую переменную с двоичными входами 0 или 1 с длиной 10. Например: Входной Тип 1 Тема 1 Раунд 1: 0000011111 Вход Тип 1 Тема 1 Раунд 2: 0000011110

Используя расстояние Левенстейна, мой подход был прост:

sort type_num Subject round_num
gen input_prev=Input[_n-1]
replace input_prev="0000000000" if round_num==1 //default starting position with 0000000000 to get search distance for first input in round 1

//Levensthein distance & clearing data (Levensthein instead of hamming distance)
ustrdist Input input_prev
rename strdist input_change

Сейчас я пытаюсь получить правильные команды Stata для расстояния Хэмминга. Может кто поможет?

1 Ответ

0 голосов
/ 09 мая 2020

Это помогает? Насколько я понимаю, расстояние Хэмминга - это количество символов (битов), которые различаются в соответствующих позициях строк одинаковой длины. Итак, учитывая две переменные и желая проводить сравнения в каждом наблюдении, это всего лишь oop по символам.

clear
set obs 10
set seed 2803 

* sandbox 
quietly forval j = 1/2 {
    gen test`j' = ""
    forval k = 1/10 {
        replace test`j' = test`j' + strofreal(runiform() > (`j' * 0.3))
    }
}

set obs 12 
replace test1 = 10 * "1" in 11 
replace test2 = test1 in 11
replace test1 = test1[11] in 12 
replace test2 = 10 * "0" in 12 

* calculation
gen wanted = 0
quietly forval k = 1/10 {
    replace wanted = wanted + (substr(test1, `k', 1) != substr(test2, `k', 1))
}

list 

     +----------------------------------+
     |      test1        test2   wanted |
     |----------------------------------|
  1. | 1110001111   1001101000        7 |
  2. | 1111011011   1101011111        2 |
  3. | 1011001111   1110110111        5 |
  4. | 0000111011   1011010100        8 |
  5. | 1011011011   1111100110        6 |
     |----------------------------------|
  6. | 0011111100   0100011110        5 |
  7. | 0011011011   0011111010        2 |
  8. | 1010100011   1011000100        5 |
  9. | 1110011011   1010010100        5 |
 10. | 1001011111   0100111001        6 |
     |----------------------------------|
 11. | 1111111111   1111111111        0 |
 12. | 1111111111   0000000000       10 |
     +----------------------------------+
...