我需要根据二元映射的乘积构建交叉积矩阵。
二进制映射构造如下
A_ID<-c(111,116,111,112,112,114,116,113,114,111,114,116,115,116,116)
U_ID<-c(221,221,222,222,223,223,223,224,224,225,225,225,226,226,226)
df_u_a<-data.frame(U_ID,A_ID)
myTab <- table(df_u_a) # count
myTab[] <- as.integer(as.logical(myTab)) # binary map
myTab []的输出如下:
A_ID
U_ID 111 112 113 114 115 116
221 1 0 0 0 0 1
222 1 1 0 0 0 0
223 0 1 0 1 0 1
224 0 0 1 1 0 0
225 1 0 0 1 0 1
226 0 0 0 0 1 1
我需要做的交叉产品如下:
item.111<-c(myTab[][,1])
item.112<-c(myTab[][,2])
crossprod(item.111, item.112)/sqrt(crossprod(item.111) * crossprod(item.112))
在上图中,我只是说明了我计算过的一个值,但我需要计算矩阵中超过900行/列的余数。
关于如何在R中构建此交叉产品的任何想法?
答案 0 :(得分:3)
您想要的矩阵是myTab
的相关矩阵,没有以变量为中心。因此,我们可以如下获得:
crossprod(myTab %*% diag(1 / sqrt(colSums(myTab^2))))
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1.0000000 0.4082483 0.0000000 0.3333333 0.0 0.5773503
# [2,] 0.4082483 1.0000000 0.0000000 0.4082483 0.0 0.3535534
# [3,] 0.0000000 0.0000000 1.0000000 0.5773503 0.0 0.0000000
# [4,] 0.3333333 0.4082483 0.5773503 1.0000000 0.0 0.5773503
# [5,] 0.0000000 0.0000000 0.0000000 0.0000000 1.0 0.5000000
# [6,] 0.5773503 0.3535534 0.0000000 0.5773503 0.5 1.0000000