r-创建一个双变量频率矩阵
假设我有一个矩阵,其中行表示单个样本。我正在采样而不进行替换,这样行就不会包含重复的条目r-创建一个双变量频率矩阵,r,matrix,frequency,R,Matrix,Frequency,假设我有一个矩阵,其中行表示单个样本。我正在采样而不进行替换,这样行就不会包含重复的条目 samp_frame <- 1:6 samp <- matrix(c(1,2,3,3,4,1,5,1,6),nrow=3,ncol=3) samp [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 1 [3,] 3 1 6 我写了一个函数来实现这一点,但它可能不是很有效。因此,我正在寻找如何改进它的建议 pa
samp_frame <- 1:6
samp <- matrix(c(1,2,3,3,4,1,5,1,6),nrow=3,ncol=3)
samp
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 1
[3,] 3 1 6
我写了一个函数来实现这一点,但它可能不是很有效。因此,我正在寻找如何改进它的建议
pair_freq <- function(samp_frame,samp){
N <- length(samp_frame)
output <- matrix(0,nrow=N,ncol=N)
# Fill in diagonal entries
temp <- table(samp)
freq <- data.frame(id=as.numeric(rownames(temp)),
count=data.frame(temp)[,2])
for (i in 1:N){
output[i,i] <- freq[i,"count"]
}
# Fill in off-diagonal entries
for(i in 1:nrow(samp)){
current <- unique(samp[i,])
for (j in 1:(N-1)){
m <- j+1
for (k in m:N){
output[j,k] <- output[j,k] + all(c(j,k) %in% current)
output[k,j] <- output[j,k]
}
}
}
output
}
这里有一个方法:
is.present <- function(j)apply(samp,1,function(row)as.integer(any(row==j)))
m <- sapply(min(samp):max(samp),is.present)
t(m) %*% m
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 3 1 2 1 1 1
# [2,] 1 1 0 1 0 0
# [3,] 2 0 2 0 1 1
# [4,] 1 1 0 1 0 0
# [5,] 1 0 1 0 1 0
# [6,] 1 0 1 0 0 1
创建一个n×k矩阵m
,该矩阵在samp中每行有一行,每个可能结果有一列,如果数字j
存在于samp的行i
中,则m[i,j]=1
。那么
mT×m
生成一个k×k矩阵,其中元素
[i,j]
是samp
中的数或行,其中i
和j
一起出现。实矩阵包含多少列?你能解释一下如何处理同一行上的重复数字吗?例如,一行c(1,1,1,2,2)
对out[1,1],out[1,2],out[2,2]
的贡献是什么?@flodel这是一个很好的观点。我正在采样,没有替换,所以在同一行中不会有任何重复的元素。目前,我的真实数据矩阵最多有20列(每个样本/行有20个值)。我可能还应该提到,我正在从1到25对数字进行抽样。这是一个非常聪明的方法!谢谢你提供了一个非常清楚的解释。
X1 X2 freq
1 1 3
1 2 1
1 3 2
1 4 1
1 5 1
1 6 1
2 2 1
2 3 1
...
is.present <- function(j)apply(samp,1,function(row)as.integer(any(row==j)))
m <- sapply(min(samp):max(samp),is.present)
t(m) %*% m
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 3 1 2 1 1 1
# [2,] 1 1 0 1 0 0
# [3,] 2 0 2 0 1 1
# [4,] 1 1 0 1 0 0
# [5,] 1 0 1 0 1 0
# [6,] 1 0 1 0 0 1
m <- sapply(min(samp):max(samp),is.present)