Имитация данных о вхождении в R
Я пытаюсь создать набор данных о совместном вхождении, где представляющая интерес переменная является программным приложением, и я хочу смоделировать матрицу n на n, где в каждой ячейке есть число, указывающее, сколько раз приложение A использовалось с приложением Б. Как я могу создать набор данных в R, который я могу использовать для тестирования набора алгоритмов кластеризации и разделения. Какую модель я буду использовать и как я буду генерировать данные в R?
2 ответа
n <- 10
apps <- LETTERS[1:n]
data <- matrix(0,n,n)
rownames(data) <- apps
colnames(data) <- apps
# create artificial clusters
data[1:3,1:5] <- matrix(sample(3:5,15,replace=T),3,5)
data[6:9,4:8] <- matrix(sample(1:3,20,replace=T),4,5)
# clustering
hc <- hclust(dist(data))
plot(hc)
rect.hclust(hc, k=2)
Примечание. Этот ответ был отредактирован с учетом того факта, что матрица совместного вхождения должна быть симметричной.
set.seed(42)
# software names:
software <- c("a","b","c","d")
# times each software used:
times.each.sw <- c(5,10,12,3)
# co-occurrence data.frame
swdf <- setNames(data.frame(t(combn(software,2))),c("sw1","sw2"))
swdf$freq.cooc <- apply(combn(times.each.sw,2),2,function(x) sample(1:min(x),1) )
# sw1 sw2 freq.cooc
#1 a b 5
#2 a c 5
#3 a d 1
#4 b c 9
#5 b d 2
#6 c d 2
Если вы предпочитаете матрицу совместного использования, то что-то вроде этого может быть:
mat <- diag(times.each.sw)
dimnames(mat) <- list(software,software)
mat[lower.tri(mat)] <- swdf$freq.cooc
mat[upper.tri(mat)] <- t(mat)[upper.tri(mat)]
# a b c d
#a 5 5 5 1
#b 5 10 9 2
#c 5 9 12 2
#d 1 2 2 3
Диагональ содержит количество раз, когда каждое программное обеспечение использовалось (то есть использовалось с самим собой). Нижний / верхний треугольники будут содержать количество раз, когда использовалась каждая комбинация, которая всегда должна быть равна или меньше количества раз, которое использовалось реже используемой пары.