Проблема со спецификацией do.call второго аргумента - PullRequest
0 голосов
/ 17 апреля 2020

Я создал функцию, которая должна оценивать производительность двух статистических тестов. в этой функции я использую функцию вызова в первой функции для создания моих поколений данных. (уже извините за количество кода) Спасибо за вашу помощь! Проблема возникает в первом операторе if в первом для l oop. Ошибка говорит: Ошибка в [.data.frame (Design, RowDesign,): объект 'RowDesign' не найден. Вот функция:

SimStudy <- function(Design, RowDesign, K){
  #Design = Design Matrix
  #RowDesign = Number that indicates which row of Design Matrix is used
  #K = number that indicates amount of generated data sets for each row
  Results <- matrix(NA, nrow=K, ncol=4)
  for(k in 1:K){
    if(normal) {
      SimuDat <- call("DataGeneration1", x=Design[RowDesign, ])
    }else{
      SimuDat <- call("DataGeneration2", x=Design[RowDesign, ])
    }
    #Analysis with both methods
    #Analysis with Welchs´s T-test
    Analysis_old <- Method_old(SimData=SimuDat)
    #Analysis with Trimmed F-test
    Analysis_new <- Method_new(SimData=SimuDat)
    P_old <- Analysis_old$p.value
    P_new <- Analysis_new$p.value
    #store in Vector (optional)
    ResultsAnalysis <- c(P_old, P_new)
    #Evaluation
    Hyp <- ifelse(Design[RowDesign,"ef"] == 0, TRUE, FALSE)
    TypeIerror_old <- 0
    TypeIerror_new <- 0
    TypeIIerror_old <- 0
    TypeIIerror_new <- 0
    if(Hyp==TRUE) {#i do not need to write ==TRUE necessarily
      #Type I error
      if(P_old < 0.05){
        TypeIerror_old <- TypeIerror_old + 1
      }
      if(P_new < 0.05){
        TypeIerror_new <- TypeIerror_new + 1
      }
      #Type II error
      if(P_old >= 0.05){
        TypeIIerror_old <- TypeIIerror_old + 1
      }
      if(P_new >= 0.05){
        TypeIIerror_new <- TypeIIerror_new + 1
      }
    }#end if hyp
    Results[k, ] <- c(TypeIerror_old, TypeIerror_new, TypeIIerror_old, TypeIIerror_new)
  }#end for 1
  return(Results)
}

И это та часть кода, с которой я вызываю функцию:

totalcells <- nrow(Design1)
magic_for(put,silent=TRUE)
for(i in 1:totalcells){
  RowDesign <- i
  MyResult <- SimStudy(Design=Design1, RowDesign=RowDesign, K=4) 
}#end loop Sim All rows
Result <- magic_result()

Наконец, функции и пакеты, необходимые для запуска кода:

#Packages necessary
install.packages("stats") 
install.packages("PearsonDS")
install.packages("dplyr")
install.packages("magicfor")
library(stats)
library(PearsonDS)
library(dplyr)
library(magicfor)
#Preperation to creat fulfactorial Design Matrix
samp1 <- c(1,2,3,4)
samp2 <- c(1,2,3,4)
ef <- c(0,0.2,0.5,0.8)
vari1 <- c(3)
vari2 <- c(3,9)
Design1 <- expand.grid(samp1=samp1, samp2=samp2, ef=ef, vari1=vari1, vari2=vari2)
#Functions necessary
DataGeneration1 <- function(samp1, samp2, ef, vari1, vari2){
  gen1 <- rnorm(n=samp1, mean=1, sd=sqrt(vari1))
  gen2 <- rnorm(n=samp2, mean=1+ef, sd=sqrt(vari2))
  Y <- c(gen1, gen2)
  group <- as.factor(c(rep(1, times=length(gen1)), rep(2, times=length(gen2))))
  SimData <- data.frame(Y,group)
  return(SimData)
}
DataGeneration2 <- function(samp1, samp2, ef, vari1, vari2){
  gen1 <- rnorm(n=samp1, mean=1, sd=sqrt(vari1)+2)
  gen2 <- rnorm(n=samp2, mean=1+ef, sd=sqrt(vari2)+1)
  Y <- c(gen1, gen2)
  group <- as.factor(c(rep(1, times=length(gen1)), rep(2, times=length(gen2))))
  SimData <- data.frame(Y,group)
  return(SimData)
}
Method_old<- function(SimData){
  formula <- Y~group
  res <- t.test(formula, data = SimData)
  return <- res
}
Method_new<- function(SimData){
  formula <- Y~group
  res <- wilcox.test(formula, data = SimData)
  return <- res
}

1 Ответ

0 голосов
/ 17 апреля 2020

Может быть, вы можете попробовать

if(normal){
      SimData <- do.call(MyDataGeneration1, as.list(x[y, ]))
    }else{
      SimData <- do.call(MyDataGeneration2, as.list(x[y, ]))
    }
...