【问题标题】:Simulating Co-occurrence data in R在 R 中模拟共现数据
【发布时间】:2014-03-04 05:06:33
【问题描述】:

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

【问题讨论】:

  • 您打算使用哪种聚类/分区算法或软件包?这通常会决定您需要作为输入的数据格式。
  • 我正在考虑使用算法组合来测试它们的性能。但是,我需要样本数据来测试它们,那么如何创建数据集?

标签: r dataset cluster-analysis simulation


【解决方案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

对角线包含每个软件的使用次数(即与自身一起使用)。下方/上方三角形将包含每个组合的使用次数,该次数必须始终等于或小于使用频率较低的组合的使用次数。

【讨论】:

  • 这正是我想要生成的,谢谢。但是,仍然存在一个问题,我应该使用什么采样分布来生成模拟数据?
【解决方案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)

注意:此答案已被编辑以反映共现矩阵必须是对称的事实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多