R 稀疏矩阵上的所有相关对

R 稀疏矩阵上的所有相关对,r,data.table,R,Data.table,我已经编写了一些代码来计算数据集中所有ID对之间的相关性。输入和输出格式如下所示: Input: obsid | varid | value Output: obsid1 | obsid2 | correl 我意识到相关性和所有对函数都是可用的,并在前面进行了讨论。这可能不同,因为我使用键/值或深度格式进行输入和输出。此外,我需要解决的实例有约200000个观测值和约500个密度为20%的变量。实际上,我需要计算4 x 10^10的相关性!所以,我希望这能非常有效 以下是创建实例的代码: r

我已经编写了一些代码来计算数据集中所有ID对之间的相关性。输入和输出格式如下所示:

Input:  obsid | varid | value
Output: obsid1 | obsid2 | correl
我意识到相关性和所有对函数都是可用的,并在前面进行了讨论。这可能不同,因为我使用键/值或深度格式进行输入和输出。此外,我需要解决的实例有约200000个观测值和约500个密度为20%的变量。实际上,我需要计算4 x 10^10的相关性!所以,我希望这能非常有效

以下是创建实例的代码:

require(data.table)

CreateInstance <- function(nobs,nvar,density) {
    dtbl <- data.table(
        do.call("rbind", 
            lapply(1:nobs, function(n) { 
                v <- which(runif(nvar)<density)
                if(length(v)>0) {cbind(n,v)}
            })
        )
    )
    setnames(dtbl, c("obsid","varid"))
    dtbl$value <- as.numeric(sample(1:50, nrow(dtbl), replace=TRUE))
    return(dtbl)
}
require(data.table)

CreateInstance速度问题=>提供
Rprof()
输出。这可能指向
do.call
rbind
,然后搜索“do.call rbind speed”。使用一个普通的
for
循环来计时
nobs
调用
GetCorrelationsForObs
,看看它是否真的是那样,或者它周围的
do.call rbind
。大概
set.seed(100)
nobs <- 10
nvar <- 4
dens <- .5
inst <- CreateInstance(nobs,nvar,dens)
GetCorrelationsForObs <- function(n) {
    dtbl <- inst[inst[obsid==n,2:3,with=FALSE]][, list(sumxy=sum(value*i.value)), by=obsid]
    if(nrow(dtbl)==0) {return(data.table(obsid1=integer(0),obsid2=integer(0),correl=numeric(0)))}
    dtbl <- inst.summ[dtbl][obsid!=n]
    infoy <- inst.summ[obsid==n,c(sumx,sdx)]
    dtbl <- dtbl[, list(obsid2=obsid, 
        correl=(nvar*sumxy-infoy[1]*sumx)/(infoy[2]*sdx))][!is.na(correl),][order(-rank(correl))]
    return(if(nrow(dtbl)>nbors) cbind(obsid1=n,dtbl[1:nbors]) else cbind(obsid1=n,dtbl))
}
inst.summ <- inst[, list(sumx=sum(value), sdx=sqrt(nvar*sum(value^2)-sum(value)^2)), by="obsid"]
nbors <- 2
setkey(inst,varid)
setkey(inst.summ,obsid)
correl.dt <- data.table(do.call("rbind", lapply(1:nobs, GetCorrelationsForObs) ))