我是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之间建立连接。
感谢。
答案 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)"
>