ff: возвращение нескольких массивов одним вызовом функции ffapply - PullRequest
0 голосов
/ 02 июля 2018

Я имею дело с большим набором данных трехмерных изображений, которые я загрузил в R, используя ff().

require(ff)

nSubj <- 125
vol_dim <- c(139,137,87)
ff_qmap <- ff(0, dim=c(vol_dim,nSubj)

Простые вызовы, такие как возврат среднего массива / "объема", работают нормально:

mean_qmap_vol <- ffapply(X=ff_qmap,MARGIN=c(1,2,3),AFUN=mean,RETURN=TRUE)

Однако в некоторых случаях я хотел бы вернуть более одного массива / «тома» обратно за один ffapply вызов; например, при выполнении некоторой базовой регрессии, например против возраста:

pval_vol <- ffapply( AFUN=f <- function(x) {
                  df$voxel <- x
                    fe1 <- lm(formula = voxel ~ age, df)
                    summary_fe1 <- summary(fe1)
                fe1_estimate <- summary_fe1$coefficients[2,1]
                fe1_pval <- summary_fe1$coefficients[2,4]
                return(fe1_pval)
}, X = ff_qmap, MARGIN = c(1,2,3), RETURN = TRUE)

Это работает для возврата одного тома назад, т.е. fe1_pval.

Есть ли способ вернуть оба значения fe1_estimate и fe1_pval (и, возможно, больше оценок) в одном вызове ffapply?

> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.2 LTS   
...
other attached packages:
[1] ff_2.2-13        bit_1.1-12       lme4_1.1-17      Matrix_1.2-8     ggplot2_2.2.1    fslr_2.12        neurobase_1.13.2
[8] oro.nifti_0.9.1 

1 Ответ

0 голосов
/ 06 июля 2018

Я попробовал несколько решений, включая возврат комбинированного вектора с помощью c () и, альтернативно, списка. Тем не менее, я не смог найти решение, включающее подпрограмму ffapply, которая бы работала. Вот некоторые ключевые ссылки, на которые я смотрел:

Я нашел решение с ограничением по времени, выбрав классический подход для циклического подхода и циклически проходящий через набор 3D данных. Поскольку размер моего массива не слишком велик в этом случае, он работает. В конечном итоге я бы предпочел решение, использующее ffapply (), чтобы оно было расширяемым для более высокого разрешения и больших наборов данных; и имеет потенциал для распараллеливания. Открыты для предложений!

Функция coef() stats оказалась отличным способом извлечения всех модельных коэффициентов стандартным способом.

testlist <- vector(mode="list", length=vol_dim[1]*vol_dim[2]*vol_dim[3])
i <- 1
for (x in 1:vol_dim[1]) {
  for (y in 1:vol_dim[2]) {
    for (z in 1:vol_dim[3]) {
      df$voxel <- ff_logjac[x,y,z,]
      fe1 <- lm(formula = voxel ~ age, df)
      testlist[[i]] <- coef(summary(fe1))
      i <- i + 1
    }
  }
}

Вот как осуществляется доступ к списку () коэффициентов lm после:

> length(testlist)
[1] 1656741
> vol_dim[1]*vol_dim[2]*vol_dim[3]
[1] 1656741
> testlist[[1]]
                Estimate  Std. Error    t value  Pr(>|t|)
(Intercept)  0.061286603 0.168853045  0.3629582 0.7191810
age         -0.002272307 0.003510186 -0.6473466 0.5223308
> testlist[[1656741]]
                Estimate  Std. Error   t value   Pr(>|t|)
(Intercept) -0.444810783 0.192135240 -2.315092 0.02763245
age          0.007246639 0.003994186  1.814297 0.07964480
> testlist[[1]][1,1]
[1] 0.0612866
...