我在学习 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 <- c(6:10)
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))
但它看起来我什至没有接近......
感谢您抽出宝贵时间阅读本文!
您不妨多花些时间来回复;-)。