小编Mr.*_*Zen的帖子

RcppArmadillo 的 sample() 更新 R 后不明确

我通常使用一个简短的 Rcpp 函数,该函数将一个矩阵作为输入,其中每行包含 K 个总和为 1 的概率。然后该函数为每一行随机采样 1 到 K 之间的整数,对应于提供的概率。这是函数:

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadilloExtensions/sample.h>

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0];
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我最近更新了 R 和所有软件包。现在我不能再编译这个函数了。我不清楚原因。跑步

library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous
Run Code Online (Sandbox Code Playgroud)

这基本上告诉我,我的电话RcppArmadillo::sample()是模棱两可的。任何人都可以启发我为什么会这样吗?

r rcpp rcpparmadillo

9
推荐指数
1
解决办法
177
查看次数

有效地比较R中的矩阵

我有一个a包含一些矩阵的数组.现在我需要有效地检查我有多少不同的矩阵以及它们在数组中有哪些索引(按升序排列).我的方法如下:将矩阵的列粘贴为字符向量,并查看频率表,如下所示:

n <- 10 #observations
a <- array(round(rnorm(2*2*n),1),
           c(2,2,n))

paste_a <- apply(a, c(3), paste, collapse=" ") #paste by column
names(paste_a) <- 1:n
freq <- as.numeric( table(paste_a) ) # frequencies of different matrices (in ascending order)
indizes <- as.numeric(names(sort(paste_a[!duplicated(paste_a)]))) 
nr <- length(freq) #number of different matrices
Run Code Online (Sandbox Code Playgroud)

但是,当你增加到n大数时,这会变得非常低效(主要paste()是变得越来越慢).有没有人有更好的解决方案?

这是一个包含100个观测值的"真实"数据集,其中一些矩阵是实际重复的(与我上面的例子相反):https://pastebin.com/aLKaSQyF

非常感谢你.

performance r matrix

8
推荐指数
1
解决办法
537
查看次数

按组有效填写NAs

我有一个数据集,我在某个人身上观察变量而不是其他人.对于我观察变量的那些人,我只观察了一次.但是,每个人的观察数量以及观察值的位置会有所不同.

如果存在非NA值,我想用非NA值填充给定个体的所有NA值.否则,NA应该保持NA.

这是一个示例数据集:

#data.frame of 100 individuals with 10 observations each
data <- data.frame(group = rep(1:100,each=10),value = NA)

#first 50 individuals get a value at the fifth observation, others don't have value
data$value[seq(5,500,10)] <- rnorm(50)
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好,不是一个大问题.从另一个线程中获取,我们可以使用dplyr和执行以下操作tidyr:

data <- data %>% 
  group_by(group) %>% #by group
  fill(value) %>% #default direction down
  fill(value, .direction = "up") #also fill NAs upwards
Run Code Online (Sandbox Code Playgroud)

这完全解决了这个问题.但是,我必须为大约80十年代做这件事.观察,需要数小时.有更快的方法吗?我认为data.table可能是一个很好的候选人.

如果可以调整方法以仅填充出现在值之前的NA,那也将是很好的.

谢谢!

performance r na

8
推荐指数
2
解决办法
296
查看次数

Rcpp rowMaxs 与 matrixStats rowMaxs

我正在尝试在 Rcpp 中有效地计算 rowMaxs。一个非常简单的实现是

arma::mat RcppRowmaxs(arma::mat x){  

  int N = x.n_rows;
  arma::mat rm(N,1);

  for(int nn = 0; nn < N; nn++){
      rm(nn) = max(x.row(nn));
  }

  return(rm);
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好。但是,将此功能与其他包进行比较,结果证明其他实现要高效得多。具体来说,Rfast::rowMaxs比简单的 Rcpp 实现快 6 倍以上!

自然地,我试图模仿Rfast. 但是,作为 Rcpp 的初学者,我只尝试Rfast::rowMaxs直接在 Rcpp 中加载,例如此处所述。不幸的是,根据我的基准测试,使用 Rcpp 脚本加载再次调用 Rcpp 脚本的 R 函数似乎很慢(请参阅“RfastinRcpp”行):

m = matrix(rnorm(1000*1000),1000,1000)

microbenchmark::microbenchmark(

  matrixStats    = matrixStats::rowMaxs(m),
  Rfast          = Rfast::rowMaxs(m,value=T),
  Rcpp           = RcppRowmaxs(m),
  RfastinRcpp    = RfastRcpp(m),
  apply          = apply(m,1,max)

)

Unit: microseconds
        expr       min         lq       mean     median        uq …
Run Code Online (Sandbox Code Playgroud)

r rcpp

5
推荐指数
1
解决办法
182
查看次数

将二元向量转换为二进制矩阵

我有一个二进制向量,可以保存某些观察事件是否发生的信息:

v <- c(0,1,1,0)
Run Code Online (Sandbox Code Playgroud)

我想要实现的是一个矩阵,其中包含该向量中所有双变量观测对的信息.也就是说,如果两个观察值都为0或两个都在此向量v中有1,则它们应该在矩阵中得到1.如果一个有0而另一个有1,那么它们应该得到0.

因此,目标是这个矩阵:

     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    0    1    0
[3,]    0    1    0    0
[4,]    1    0    0    0
Run Code Online (Sandbox Code Playgroud)

主对角线是0还是1对我来说无关紧要.

有没有一种有效而简单的方法来实现这一点,不需要if语句和for循环的组合?v可能是相当大的.

谢谢!

binary r vector matrix

4
推荐指数
1
解决办法
89
查看次数

ggplot() 中偏导数的表达式是什么?

是否可以通过expression()in获得偏导数符号ggplot2,例如用于轴标签?

我说的是这个符号,通常也称为“del”或“c​​urly d”:https : //en.wikipedia.org/wiki/%E2%88%82

它的 unicode 编号为 U+2202,但是当我尝试将它包含在 ggplot 中时,它失败了:

a <- b <- rnorm(100)
plot.df <- data.frame(a,b)

ggplot(plot.df,aes(a,b)) + 
  geom_point() + 
  xlab(expression('\u2202'))
Run Code Online (Sandbox Code Playgroud)

德尔

为了进行比较,例如使用带有 unicode 编号 U+00B1 的加号/减号可以正常工作:

ggplot(plot.df,aes(a,b)) + 
  geom_point() + 
  xlab(expression('\u00b1'))
Run Code Online (Sandbox Code Playgroud)

正负

r ggplot2

4
推荐指数
1
解决办法
182
查看次数

向量的稀疏矩阵

我有一个带有值 ( val) 的向量和一个指示组成员身份的向量 ( group):

vec   <- 1:9
group <- rep(1:3, c(2,4,3))
Run Code Online (Sandbox Code Playgroud)

假设我们有K组和总值N,因此两个向量都有 length N。目标是有效构建稀疏“块对角”矩阵,其中第一列保存组 1 的值,第二列保存组 2 的值,依此类推。但是,这些值不应该“重叠”,因为每行应该只有一个值,请参阅下面的解决方案。我需要用非常大的尺寸来执行此操作数千KN。因此,以下基于循环的解决方案不够高效:

K     <- length(unique(group))
N     <- length(group)
M     <- matrix(0, N, K)

for(k in 1:K){
  
 M[group == k, k] <- vec[group == k]
        
}

Matrix::Matrix(M, sparse = T)

9 x 3 sparse Matrix of class "dgCMatrix"
           
 [1,] 1 . .
 [2,] 2 . .
 [3,] . 3 .
 [4,] . …
Run Code Online (Sandbox Code Playgroud)

r matrix sparse-matrix

4
推荐指数
1
解决办法
340
查看次数

Rcpp中二项式似然的快速评估

我需要非常快速地评估大量二项式似然。因此,我正在考虑在 Rcpp 中实现这一点。一种方法如下:

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector eval_likelihood(arma::vec Yi,
                              arma::vec Ni,
                              arma::vec prob){

  // length of vector
  int N = prob.n_rows;

  // storage for evaluated log likelihoods
  NumericVector eval(N);

  for(int ii = 0; ii < N; ii++){

  int y = Yi(ii); // no. of successes
  int n = Ni(ii); // no. of trials
  double p = prob(ii); // success probability

  eval(ii) = R::dbinom(y,n,p,true); // argument 4 is set to true to return log-likelihood

  } …
Run Code Online (Sandbox Code Playgroud)

r rcpp probability-distribution log-likelihood

3
推荐指数
1
解决办法
125
查看次数

通过预计算加速矩阵乘积

我正在研究一个必须迭代计算矩阵多次的问题。必要的矩阵乘法采用以下形式

t(X) %*% ( ( X %*% W %*% t(X) * mu0 ) * mu1 )
Run Code Online (Sandbox Code Playgroud)

其中X和是对称矩阵N x P。和是计算成本低廉的向量,并按元素输入相应的乘积。W P x Pmu0mu1N x 1

不幸的是,N可能非常大,这导致了巨大的计算X %*% W %*% t(X)需求N x N。我想知道是否有任何策略或计算技巧,例如基于矩阵分解,可以用来加速这里的计算。在每次迭代中,mu0和 都会mu1发生变化,但XW是固定的,因此包括这些矩阵在内的任何预计算都将起作用。

基准测试

到目前为止,我能想到的最快方法是进行一些明显的预计算:

# fake data
N   = 2500
P   = 10
X   = matrix(rnorm(N*P), N, P)
W   = matrix(rnorm(P*P), P, P)
mu0 = rnorm(N) …
Run Code Online (Sandbox Code Playgroud)

statistics r matrix linear-algebra matrix-multiplication

3
推荐指数
1
解决办法
80
查看次数

在R中有效地应用sample()

我需要在给定具有行方式结果概率的矩阵的情况下对结果变量进行采样.

set.seed(1010) #reproducibility

#create a matrix of probabilities
#three possible outcomes, 10.000 cases
probabilities <- matrix(runif(10000*3),nrow=10000,ncol=3)
probabilities <- probabilities / Matrix::rowSums(probabilities)
Run Code Online (Sandbox Code Playgroud)

我能想出的最快方法是apply()和sample()的组合.

#row-wise sampling using these probabilities
classification <- apply(probabilities, 1, function(x) sample(1:3, 1, prob = x))
Run Code Online (Sandbox Code Playgroud)

但是,在我正在做的事情中,这是计算瓶颈.您是否知道如何加快此代码速度/如何更有效地进行采样?

谢谢!

r sample probability apply

2
推荐指数
1
解决办法
120
查看次数