2015-09-06 52 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