相关疑难解决方法(0)

为什么诊断功能这么慢?[在R 3.2.0或更早版本]

我正在查看这个答案中的基准,并希望将它们与diag(用于不同的答案)进行比较.不幸的是,似乎diag需要很长时间:

nc  <- 1e4
set.seed(1)
m <- matrix(sample(letters,nc^2,replace=TRUE), ncol = nc)

microbenchmark(
  diag = diag(m),
  cond = m[row(m)==col(m)],
  vec  = m[(1:nc-1L)*nc+1:nc],
  mat  = m[cbind(1:nc,1:nc)],
times=10)
Run Code Online (Sandbox Code Playgroud)

评论:我测试了这些identical.我从这个家庭作业问题的答案中选了一个"cond" .结果类似于整数矩阵,1:26而不是letters.

结果:

Unit: microseconds
 expr         min          lq         mean       median          uq         max neval
 diag  604343.469  629819.260  710371.3320  706842.3890  793144.019  837115.504    10
 cond 3862039.512 3985784.025 4175724.0390 4186317.5260 4312493.742 4617117.706    10
  vec     317.088     329.017     432.9099     350.1005     629.460     651.376    10
  mat     272.147 …
Run Code Online (Sandbox Code Playgroud)

r matrix diagonal

43
推荐指数
1
解决办法
906
查看次数

R使用什么算法来计算平均值?

我很想知道R的平均函数使用什么算法.是否有一些参考该算法的数值属性?

我在summary.c中找到了以下C代码:do_summary():

case REALSXP:
PROTECT(ans = allocVector(REALSXP, 1));
for (i = 0; i < n; i++) s += REAL(x)[i];
s /= n;
if(R_FINITE((double)s)) {
    for (i = 0; i < n; i++) t += (REAL(x)[i] - s);
    s += t/n;
}
REAL(ans)[0] = s;
break;
Run Code Online (Sandbox Code Playgroud)

它似乎做了一个直线意思:

for (i = 0; i < n; i++) s += REAL(x)[i];
s /= n;
Run Code Online (Sandbox Code Playgroud)

然后它添加了我假设的数值修正,它似乎是与数据平均值的平均差异:

for (i = 0; i < n; i++) t += (REAL(x)[i] - s);
s += t/n;
Run Code Online (Sandbox Code Playgroud)

我无法在任何地方跟踪此算法(意味着不是一个很棒的搜索词).

任何帮助将非常感激.

c r numerical-analysis

20
推荐指数
2
解决办法
503
查看次数

S4方法调度慢吗?

我的S4类有一个多次调用的方法.我注意到执行时间比独立调用类似函数时要慢得多.所以我在我的类中添加了一个带有"function"类型的插槽,并使用该函数而不是方法.下面的示例显示了两种执行此操作的方法,它们都比相应的方法运行得快得多.此外,该示例表明该方法的较低速度不是由于必须从类中检索数据的方法,因为即使它们也这样做,功能也更快.

当然,这种做事方式并不理想.我想知道是否有办法加速方法调度.有什么建议?

    setClass(Class = "SpeedTest", 
      representation = representation(
        x = "numeric",
        foo1 = "function",
        foo2 = "function"
      )
    )

    speedTest <- function(n) {
      new("SpeedTest",
        x = rnorm(n),
        foo1 = function(z) sqrt(abs(z)),
        foo2 = function() {}
      )
    }

    setGeneric(
      name = "method.foo",
      def = function(object) {standardGeneric("method.foo")}
    )
    setMethod(
      f = "method.foo", 
      signature = "SpeedTest",
      definition = function(object) {
        sqrt(abs(object@x))
      }
    )

    setGeneric(
      name = "create.foo2",
      def = function(object) {standardGeneric("create.foo2")}
    )
    setMethod(
      f = "create.foo2", 
      signature = "SpeedTest",
      definition = function(object) { …
Run Code Online (Sandbox Code Playgroud)

r dispatch s4

10
推荐指数
2
解决办法
750
查看次数

R和MATLAB上多维数组的算术平均值:性能的巨大差异

我在R和MATLAB上使用多维数组,这些数组有五个维度(总共14.5M的元素).我必须删除一个应用算术平均值的维度,我发现使用这两个软件的性能差异很大.

MATLAB:

>> a = rand([144  73  10   6  23]);
>> tic; b = mean(a,3); toc
Elapsed time is 0.014454 seconds.
Run Code Online (Sandbox Code Playgroud)

R:

> a = array(data = runif(144*73*6*23*10), dim = c(144,73,10,6,23))
> start <- Sys.time (); b = apply(a, c(1,2,4,5), mean); Sys.time () - start
Time difference of 1.229083 mins
Run Code Online (Sandbox Code Playgroud)

我知道应用函数很慢,因为它类似于通用函数,但我不知道如何处理这个问题,因为这种性能差异对我来说真的是一个很大的限制.我试图搜索colMeans/rowMeans函数的泛化,但我没有成功.

编辑 我将展示一个小样本矩阵:

> dim(a)
[1] 2 4 3
> dput(aa)
structure(c(7, 8, 5, 8, 10, 11, 9, 9, 6, 12, 9, 10, 12, 10, 14, 
12, 7, 9, 8, …
Run Code Online (Sandbox Code Playgroud)

performance matlab r

9
推荐指数
2
解决办法
1846
查看次数

如何从lm结果中获得RMSE?

我知道根均方误差$sigma的概念之间存在细微差别.所以,我想知道在R中获取RMSE 功能的最简单方法是什么?lm

res<-lm(randomData$price ~randomData$carat+
                     randomData$cut+randomData$color+
                     randomData$clarity+randomData$depth+
                     randomData$table+randomData$x+
                     randomData$y+randomData$z)

length(coefficients(res))
Run Code Online (Sandbox Code Playgroud)

包含24个系数,我不能再手动制作我的模型了.那么,我如何根据系数驱动来评估RMSE lm

regression r linear-regression lm

9
推荐指数
3
解决办法
2万
查看次数

计算庞大数据帧中的pvalue需要很长时间

我试图p.values用长数据格式的非常庞大的数据框中的学生t检验来计算.由于我的原始数据框有关于数据框内的行,因此p.values的计算需要很长时间(大约需要100分钟).

我正在尝试加快这个过程,但我不确定数据框是否是提高速度的最佳格式,或者我是否应该重塑数据并使用a matrix.

这是一个可重复的例子,最后有一个小数据框和一个基准.

library(dplyr)

my.t.test <- function (x, y = NULL) {
  nx <- length(x)
  mx <- mean(x)
  vx <- var(x)
  ny <- length(y)
  my <- mean(y)
  vy <- var(y)
  stderrx <- sqrt(vx/nx)
  stderry <- sqrt(vy/ny)
  stderr <- sqrt(stderrx^2 + stderry^2)
  df <- stderr^4/(stderrx^4/(nx - 1) + stderry^4/(ny - 1))
  tstat <- (mx - my - 0)/stderr
  pval <- 2 * pt(-abs(tstat), df)
  return(pval)
}

cont <- c("A", "B")
set.seed(1)
df1 <- data.frame(id=rep(1:1000, each=8),
                  replicate=1:4,
                  A=rnorm(8000, …
Run Code Online (Sandbox Code Playgroud)

performance r dplyr

5
推荐指数
2
解决办法
106
查看次数