R:编码为什么在结果中显示0.00

时间:2016-04-06 12:29:25

标签: r if-statement for-loop gamma-distribution

我的模拟目的是评估几种因素组合下的测试的1类错误率。

  1. 样本量 - (10,10),(10,25),(25,25),(25,50),(25,100),50,25),(50,100),(100,25) ),(100,100)

  2. 标准差比率 - (1.00,1.50,2.00,2.50,3.00和3.50)

  3. 具有不等偏度和相等偏度的伽马分布分布

  4. 所涉及的2个样本测试是合并方差t检验和welch t检验以及mann whitney检验。我尝试使用上述因素组合修改代码。

    ########################################
        #for normal distribution setup
    
    # to ensure the reproducity of the result 
    #(here we declare the random seed generator) 
    set.seed(1)
    
    ## Put the samples sizes into matrix then use a loop for sample sizes
     sample_sizes<-matrix(c(10,10,10,25,25,25,25,50,25,100,50,25,50,100,100,25,100,100),
     nrow=2)
    
    #create vector to combine all std deviations
    sds<-matrix(c(4,4,6,4,8,4,10,4,12,4,14,4),nrow=2)
    
    sd1<-c(4,6,8,10,12)
    sd2<-c(4,4,4,4,4)
    sds2<-rep(sd2,each=9)
    
    ##(use expand.grid)to create a data frame from combination of data
    ss_sds1<- expand.grid(sample_sizes[2,], sd1)
    
    #create a matrix combining the fifty four cases of combination of ss and sds
    all_combine <- cbind(rep(sample_sizes[1,], 5), ss_sds1,sds2)
    
    # name the column by sample samples 1 and 2 and standard deviation
    colnames(all_combine) <- c("m", "n", "sds1","sds2")
    
    #number of simulations 
    nSims<-10000
    
    #set significance level,alpha for the whole simulation
    alpha<-0.05       
    
    #set up matrix for storing data from simulation
    #set nrow =nsims because wan storing every p-value simulated
    matrix1_equal  <-matrix(0,nrow=nSims,ncol=9)
    matrix4_unequal<-matrix(0,nrow=nSims,ncol=9)
    matrix7_mann   <-matrix(0,nrow=nSims,ncol=9)
    
    #set up vector for storing data from the three tests (nrow for all_combine=45)
    equal1  <- unequal4<- mann7 <- rep(0, nrow(all_combine))
    
      # this loop steps through the all_combine matrix
      for(ss in 1:nrow(all_combine))  
      {
       #generate samples from the first column and second column
        m<-all_combine[ss,1]
        n<-all_combine[ss,2]   
    
          for (sim in 1:nSims)
          {
          #generate random samples from 2 normal distribution
          x<-rnorm(m,5,all_combine[ss,3])
          y<-rnorm(n,5,4)
    
          #extract p-value out and store every p-value into matrix
          matrix1_equal[sim,1]<-t.test(x,y,var.equal=TRUE)$p.value    
          matrix4_unequal[sim,4]<-t.test(x,y,var.equal=FALSE)$p.value 
          matrix7_mann[sim,7] <-wilcox.test(x,y)$p.value 
           }
    
         ##store the result
         equal1[ss]<- mean(matrix1_equal[,1]<=alpha)
         unequal4[ss]<-mean(matrix4_unequal[,4]<=alpha)
         mann7[ss]<- mean(matrix7_mann[,7]<=alpha)
      }
    
       # combine results
        nresult <- cbind(all_combine, equal1, unequal4, mann7)
    
        save.image(file="normal.data")
    

    我是R的新手,现在我已经完成了正态分布的代码,并且必须通过使用if else添加另外两个关于伽马分布分布的模拟...任何人都可以提供一些建议如何从正常分布更改。伽马分配?我现在正在坚持这一部分......

    HELP !! 上面的代码给了我几次0.00的结果,我已经多次检查它们但我没有发现任何错误。 请

2 个答案:

答案 0 :(得分:1)

这是我目前的编码..

 ########################################
    #for normal distribution setup

# to ensure the reproducity of the result 
#(here we declare the random seed generator) 
set.seed(1)

## Put the samples sizes into matrix then use a loop for sample sizes
 sample_sizes<-matrix(c(10,10,10,25,25,25,25,50,25,100,50,25,50,100,100,25,100,100),
 nrow=2)

#create vector to combine all std deviations
sds<-matrix(c(4,4,6,4,8,4,10,4,12,4,14,4),nrow=2)

sd1<-c(4,6,8,10,12)
sd2<-c(4,4,4,4,4)
sds2<-rep(sd2,each=9)

##(use expand.grid)to create a data frame from combination of data
ss_sds1<- expand.grid(sample_sizes[2,], sd1)

#create a matrix combining the fifty four cases of combination of ss and sds
all_combine <- cbind(rep(sample_sizes[1,], 5), ss_sds1,sds2)

# name the column by sample samples 1 and 2 and standard deviation
colnames(all_combine) <- c("m", "n", "sds1","sds2")

#number of simulations 
nSims<-10000

#set significance level,alpha for the whole simulation
alpha<-0.05       

#set up matrix for storing data from simulation
#set nrow =nsims because wan storing every p-value simulated
matrix1_equal  <-matrix(0,nrow=nSims,ncol=9)
matrix4_unequal<-matrix(0,nrow=nSims,ncol=9)
matrix7_mann   <-matrix(0,nrow=nSims,ncol=9)

#set up vector for storing data from the three tests (nrow for all_combine=45)
equal1  <- unequal4<- mann7 <- rep(0, nrow(all_combine))

  # this loop steps through the all_combine matrix
  for(ss in 1:nrow(all_combine))  
  {
   #generate samples from the first column and second column
    m<-all_combine[ss,1]
    n<-all_combine[ss,2]   

      for (sim in 1:nSims)
      {
      #generate random samples from 2 normal distribution
      x<-rnorm(m,5,all_combine[ss,3])
      y<-rnorm(n,5,4)

      #extract p-value out and store every p-value into matrix
      matrix1_equal[sim,1]<-t.test(x,y,var.equal=TRUE)$p.value    
      matrix4_unequal[sim,4]<-t.test(x,y,var.equal=FALSE)$p.value 
      matrix7_mann[sim,7] <-wilcox.test(x,y)$p.value 
       }

     ##store the result
     equal1[ss]<- mean(matrix1_equal[,1]<=alpha)
     unequal4[ss]<-mean(matrix4_unequal[,4]<=alpha)
     mann7[ss]<- mean(matrix7_mann[,7]<=alpha)
  }

   # combine results
    nresult <- cbind(all_combine, equal1, unequal4, mann7)

    save.image(file="normal.data")

答案 1 :(得分:0)

我编辑了您的代码以测试类型1错误。对于每个因子组合而不是具有多个嵌套for循环,我更喜欢将所有这些组合放入单个矩阵中并对所述矩阵的每一行进行模拟。这样可以更容易地绘制结果。为了加快计算速度,请注意我做了更少的simualations(我更改了nSims),你想要更改它。最后,您可以将三个结果矩阵组合到不同的因子组合中。

我不知道你在(**ss-1)*nsds+sim**发生了什么,并选择改变它。

#for normal distribution setup

## Put the samples sizes into matrix then use a loop for sample sizes
 sample_sizes<-
  matrix(c(10,10,10,25,25,25,25,50,25,100,50,25,50,100,100,25,100,100),
     nrow=2)

#create vector to combine all std deviations
sds<-c(4,6,8,10,12,14)

# get all combinations with one row of the sample_sizes matrix
all_combn <- expand.grid(sample_sizes[2,], sds)

# tack on the first row

all_combn <- cbind(rep(sample_sizes[1,], 6), all_combn)
# change the column names
colnames(all_combn) <- c("ss1", "ss2", "sds")


# to ensure the reproducity of the result 
#(here we declare the random seed generator) 
set.seed(1)

#number of simulations 
nSims<-500    

# to store your simulations for the three tests
store_sim <- matrix(0, nrow = nSims, ncol = 3)
#set significance level,alpha for the whole simulatio
alpha<-0.05       


#set up vector for storing data from the three tests

equal  <- unequal<- mann <- rep(0, nrow(all_combn))


# outer loop run nsims for every combinations of std deviations and ss


  # this loop steps through the all_combn matrix
  for(ss in 1:nrow(all_combn))  
  {
    m<-all_combn[ss,1]
    n<-all_combn[ss,2]   

      for (sim in 1:nSims)
      {
      #generate random samples from 2 normal distribution
      x<-rnorm(m,5,all_combn[ss,3])
      y<-rnorm(n,5,4)

      #extract p-value out and store it in vectors
      store_sim[sim,1]<-t.test(x,y,var.equal=TRUE)$p.value    
      store_sim[sim,2]<-t.test(x,y,var.equal=FALSE)$p.value 
      store_sim[sim,3] <-wilcox.test(x,y)$p.value 

    }

  ##store the result into matrix defined before
  equal[ss]<- sum(store_sim[,1]<alpha)/nSims
  unequal[ss]<- sum(store_sim[,2]<alpha)/nSims
  mann[ss]<- sum(store_sim[,2]<alpha)/nSims
  }


# combine results

answer <- cbind(all_combn, equal, unequal, mann)

head(answer)

  ss1 ss2 sds equal unequal  mann
1  10  10   4 0.070   0.062 0.062
2  10  25   4 0.046   0.048 0.048
3  25  25   4 0.048   0.048 0.048
4  25  50   4 0.038   0.048 0.048
5  25 100   4 0.058   0.054 0.054
6  50  25   4 0.048   0.054 0.054