【发布时间】:2011-09-12 06:44:16
【问题描述】:
我在学习 R 的道路上给自己设置了一点挑战。问题是,给定一个包含 500 个正态分布数字的样本,平均值为 20,对于从 6 到 10 的标准偏差,我会得到多少个 20 以下的数字。只是为了了解更多信息,我决定为每个 sd 获取 4 个样本。所以到最后我应该有:
sd6samp1:...
sd6samp2:...
....
sd10samp4:...
我的第一个方法是:
ddss<-c(6:10) # sd's
sam<-c(1:4) # 4 samples for each
k=0 # counter in 0
for (i in ddss) { # for each sd
for (j in sam) { # for each sample
nam <- paste("sam",i,".",j, sep="") # building a name
n <- assign(nam,rnorm(500, 20, i)) # the great assign function
k <- k+sum(n<=0)
}
print(assign(paste("ds",i,sep=""), k)) # ohh assign you're great
k=0 # reset counter
}
在寻找如何使用循环“i”创建变量名时,发现“assign”可以完成工作,但它也表示:
请注意,如果您计划进行一些模拟, 许多大师会说你应该使用列表。
所以我认为学习列表会很好......
与此同时,我还发现了一个很棒的其他选择... ddss
for (i in ddss) {
print(paste('prob. x<=0), with sd=',i))
print(pnorm(0,mean=20,sd=i)*500)
}
这可以回答这个问题,但列表仍有待完成......还有很多 R 有待学习。主要思想不是要知道负数的概率或数量……而是要学习 R,特别是一些循环。
所以,我一直在尝试使用提到的列表
我最接近的方法是:
ddss<-c(6:10) # sd's to be calculated.
sam<-c(1:4) # 4 samples for each sd
liss<-list() # initializing the list
for (i in ddss) { # for each sd
liss[[i]] <- list()
for (j in sam) { # for each sample
liss[[i]][[j]] <- rnorm(500, 20, i)
print(paste('ds',i,'samp',j,'=',sum(liss[[i]][[j]]<0)))
}
}
有了这个我得到了信息,但我想知道两个问题(1 和 2)和其他一些问题(3 和 4):
我得到一个包含 10 个元素的列表,6 个空元素,然后 4 个带有子列表。我似乎无法找到如何使用 6:9 名称(非常 sd)的列表(sd)的元素 1:4。
即使我尝试过,我也无法通过“for”循环命名列表元素。对这些问题的任何见解都会很棒。
因为在这种模拟环境中。您认为哪个更好:嵌套列表(带有子列表的列表)还是简单(更长的)列表?
我想知道“应用”功能在这里是否有帮助,我尝试做一些事情,例如:
vbv<-matrix(c(6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9))
lsl<-apply(vbv, 2, function(x) rnorm(500,20,x))
但看起来我还没有接近....
感谢您抽出宝贵时间阅读本文!
你不妨多花点时间回复一下;-)。
【问题讨论】:
-
试试
lapply。它通过一个列表。您可以将lapply(ssdd) 嵌套在lapply中,并将sam作为参数传递(另请参阅dotsMethods)。
标签: r random simulation nested-lists