我想用循环填充我创建的空矩阵:
首先,我创建了空的matrizes,工作正常:
for(q in (15:30)){
assign(paste0("P",q), matrix(, nrow = q, ncol = q+1))}
但是现在当我想用我的公式填充这些矩阵时,我得到了一个尺寸错误:
for(c in (1:q+1)){
for(i in (1:q)){assign(paste0("P",q)[i,c],
((((((q-c) + 1 -(q-c+1- i))/q)^.69)/(((((q-c) + 1 - (q-c+1-i))/q)^.69+(((1 - ((q-c) + 1 -(q-c+1-i))/q))^.69))^(1/.69))) - (((((q-c)-(q-c+1-i))/q)^.69)/(((((q-c) - (q-c+1-i))/q)^.69+(((1 - ((q-c)-(q-c+1-i))/q))^.69))^(1/.69)))))}}}
然而,当我将这个循环用于单个矩阵时,例如:
t <- 20
c <- 1
i <- 1
for(c in (1:t+1)){
for(i in (1:t)){P20[i,c]<-( (((((t-c) + 1 -(t-c+1-i))/t)^.69)/
(((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) -
(((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69))))}}
如果有人感兴趣,该公式根据累积前景理论给出概率权重。
你们是否知道如何让这更优雅?我应该更好地编写用户定义的函数吗?
答案 0 :(得分:1)
如果您对您的结果矩阵列在您所分配的名称相同的列表中感到满意,可以执行以下操作:
l = lapply(15:30, function(q){
t = q
matrix(apply(expand.grid(1:q,1:(q+1)),1,
function(x){
i = x[1]
c = x[2]
( (((((t-c) + 1 -(t-c+1-i))/t)^.69)/
(((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) -
(((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69))))
}),nrow = q, ncol = q+1, byrow = TRUE)
})
names(l) = paste0("P",15:30)
我使用了t=q
和i=x[1]; c=x[2]
之类的内容,这样我就可以复制粘贴公式的概率。
我们在这里做的是使用lapply
循环问题中的给定行号,然后我们使用expand.grid
为结果向量中的所有单元格提供一对标记。对于指标,我们应用一个给定行i
的函数,列c
根据您的公式计算概率。然后将这些值转换为矩阵,使得结果具有适当的结构。
您最终会得到一个列表l
的矩阵,其中包含名为“P15”,“P16”的组件......