我是 R 新手,有 Stata 和 SAS 背景。我通常使用循环来创建变量并加速进程。
我正在执行以下操作:1)我需要为值 10,20,100 和 1000 运行循环“I”4 次,并将 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 个样本量建立联系。
谢谢。
最佳答案
大多数 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。 当且仅当随机样本 满足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)"
>
关于r - 如何进行双循环并建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32428278/