如何做双循环并创建表?

时间:2015-09-06 21:02:25

标签: r loops

我是R的新手,我来自Stata和SAS背景。我通常使用循环来创建变量并加速进程。

我正在执行以下操作:1)我需要为值10,20,100和1000运行4次循环“I”,并将4个值存储在向量或表中。循环I运行一个过程100次。因此,我们将有400次重复。

首先。我的循环需要制作100个大小为10的样本,看看这些样本中有多少满足条件并存储数量。 然后制作100个大小为20的样本,看看有多少样本满足条件......等等。

This is the variable for the sample size

    v=c(10,20,100,1000)  
This variable will store the number of observations that meet the condition
    sum.x=c(0,0,0,0)  
This is the variable for the 100 repetitions.

    sample = matrix(0,ncol=1,nrow=100)  
This is the loop.

    for (x in seq(along=v)){
    for (i in 1:100) {
      data=rnorm(`v`,0.25,1)
      test=t.test(data)
      sample[i,1]=test$p.value
    }
    sum.x[v]=sum(sample>0.05)  
      }

代码运行正常,只是它没有做我需要的:

1)sum.x有1000个观察值而不是4个。我知道!“[v]”表示行或某物的位置。我只想创建一个名为如下的矢量/变量并创建一个小表:

table=data.fram(sum.x10, sum.x20, sum.x100, sum.x1000).

2)数据只有4个观察值而不是100个。主要问题是我不知道如何在四个样本大小与100之间建立连接。

感谢。

1 个答案:

答案 0 :(得分:4)

大多数R人都会弃用循环。也许这有效:

v=c(10,20,100,1000)  

f <- function(n)
{
  sum( sapply( rep(n,100),
       function(n){t.test(rnorm(n,0.25,1))[["p.value"]] > 0.05} ) )
}

table <- sapply(v,f)

> table
[1] 83 81 40  0
  • 功能

    function(n){t.test(rnorm(n,0.25,1))[["p.value"]] > 0.05}
    
    函数f内的

    一个 大小为n的随机样本 正态分布,平均值为0.25,标准差为1, 使用此随机样本作为数据值执行t检验 检查其p值是否大于0.05。 当且仅当随机样本时,得到的逻辑值为TRUE 满足p值大于0.05的条件。

  • 然后

    sapply(rep(n,100),function(n){...})
    

    将此函数应用于向量rep(n,100)的每个组件。 这意味着测试重复100次。 结果是长度为100的逻辑向量。

  • 现在

    sum(sapply(...))
    

    对此逻辑向量的条目求和, 其中TRUE和FALSE分别为1和0 因此结果是t检验的数量 满足p值大于0.05的条件。

最后

sapply(c(10,20,100,1000),f)

创建向量

c(f(10,f(20),f(100),f(1000)).

要获得比这个最终表更多的信息,可以按如下方式拆分计算:

v=c(10,20,100,1000)  

g <- function(n,m)
{
  sapply( rep(n,m),
          function(n){t.test(rnorm(n,0.25,1))} )
}

f <- function(n)
{
  sum(g(n,100)["p.value",]>0.05)
}

table <- sapply(v,f)

现在g(n,m)是一个包含9行和m列的矩阵。第i列包含第i个t检验的结果,例如

> g(10,5)
            [,1]                [,2]                [,3]                [,4]                [,5]               
statistic   1.117835            0.3290155           1.610792            1.399736            0.8213012          
parameter   9                   9                   9                   9                   9                  
p.value     0.2925871           0.749671            0.1416849           0.195105            0.4326913          
conf.int    Numeric,2           Numeric,2           Numeric,2           Numeric,2           Numeric,2          
estimate    0.2408269           0.06949928          0.5203193           0.4262958           0.2347281          
null.value  0                   0                   0                   0                   0                  
alternative "two.sided"         "two.sided"         "two.sided"         "two.sided"         "two.sided"        
method      "One Sample t-test" "One Sample t-test" "One Sample t-test" "One Sample t-test" "One Sample t-test"
data.name   "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)" "rnorm(n, 0.25, 1)"
>