2015-09-06 99 views
2

我是R新手,来自Stata和SAS背景。我通常使用循环来创建变量并加快进程。如何做双循环和创建表?

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

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

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.The主要问题是,我不知道如何使四个样本大小之间的连接与100.

谢谢。

+0

你的第一个循环具有指数'x',但您使用内循环'v' – baptiste

+0

“sum.x [V]” 是一样的“C(sum.x [10],sum.x [20],sum.x [100],sum.x [1000])”。因此,在脚本“sum.x”中的最后一条语句长度为1000之后。 – mra68

+0

我知道循环中存在一个错误,并且我明白原因。问题是我只是不知道如何连接我想做的两件事情。感谢您花时间。 – Ahmir

回答

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 
  • 功能f内部的功能

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

    需要尺寸n一个随机样品从 均值0.25和标准偏差1的正态分布, 执行使用该随机样本作为数据值的t检验,并且 检查其p-va lue大于0.05。 当且仅当随机样本 满足p值大于0.05的条件时,生成的逻辑值为TRUE。

  • 然后

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

    适用此功能可将向量代表的每个分量(N,100)。 这意味着测试重复100次。 结果是长度100。

  • 的逻辑矢量现在

    sum(sapply(...)) 
    

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

最后

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) 

Now 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)" 
> 
+0

非常感谢。我有一些问题。我如何知道该功能正在有效地完成我要求的功能?我的意思是,当我“手工”完成这个过程以及我期望的价值时,这是一致的。但是,除了决赛桌之外,没有输出。此外,p值为0.05;我正在做一个双尾测试,命令认识到,在每个尾巴我有0.025的权利?非常感谢您的耐心和您的帮助。 – Ahmir

+1

我在我的回答中添加了一些解释。 – mra68

+0

这是一个了不起的答案。谢谢! – Ahmir