2014-02-07 31 views
1

我正在尝试创建一个共现数据的数据集,其中感兴趣的变量是一个软件应用程序,我想模拟一个n乘n的矩阵,其中每个单元格的数字都表示应用程序A与应用程序B一起使用的次数。我如何在R中创建一个数据集,我可以使用它来测试一组聚类和分区算法。我将使用什么模型以及如何生成R中的数据?模拟R中的同现数据

+0

您打算使用哪种聚类/分区算法或软件包?这通常会决定您输入数据的格式。 – thelatemail

+0

我正在考虑使用算法组合来测试它们的性能。但是,我需要样本数据来测试它们,所以如何创建数据集? – amber4478

回答

1
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) 

注:这个答案已被编辑,以反映事实的共生矩阵必须是对称的。

1
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 

对角线包含的时间使用各软件的数量(即具有自身使用)。下部/上部三角形将包含每个组合使用的次数,该数量总是必须等于或少于使用不常使用的次数。

+0

这正是我期望生成的,所以谢谢。但是,仍然存在一个问题,我应该使用什么抽样分布来生成模拟数据? – amber4478