【问题标题】:Matrice help: Finding average without the zeros矩阵帮助:找到没有零的平均值
【发布时间】:2020-02-25 22:37:41
【问题描述】:

我正在使用 R 创建蒙特卡洛模型。我的模型创建的矩阵填充了零或约束范围内的值。我正在通过我的模型运行几十万个 n 值,我想找到我创建的非零矩阵的平均值。我猜我可以在最后一节做点什么。

感谢您的帮助!

代码:

n<-252500

PaidLoss_1<-numeric(n)
PaidLoss_2<-numeric(n)
PaidLoss_3<-numeric(n)
PaidLoss_4<-numeric(n)
PaidLoss_5<-numeric(n)
PaidLoss_6<-numeric(n)
PaidLoss_7<-numeric(n)
PaidLoss_8<-numeric(n)
PaidLoss_9<-numeric(n)



for(i in 1:n){
claim_type<-rmultinom(1,1,c(0.00166439057698873, 0.000810856947763742, 0.00183509730283373, 0.000725503584841243, 0.00405428473881871, 0.00725503584841243, 0.0100290201433936, 0.00529190850119495, 0.0103277569136224, 0.0096449300102424, 0.00375554796858996, 0.00806589279617617, 0.00776715602594742, 0.000768180266302492, 0.00405428473881871, 0.00226186411744623, 0.00354216456128371, 0.00277398429498122, 0.000682826903379993))

claim_type<-which(claim_type==1)

claim_Amanda<-runif(1, min=34115, max=2158707.51)
claim_Bob<-runif(1, min=16443, max=413150.50)
claim_Claire<-runif(1, min=30607.50, max=1341330.97)
claim_Doug<-runif(1, min=17554.20, max=969871)


if(claim_type==1){PaidLoss_1[i]<-1*claim_Amanda}
if(claim_type==2){PaidLoss_2[i]<-0*claim_Amanda}
if(claim_type==3){PaidLoss_3[i]<-1* claim_Bob}
if(claim_type==4){PaidLoss_4[i]<-0* claim_Bob}
if(claim_type==5){PaidLoss_5[i]<-1* claim_Claire}
if(claim_type==6){PaidLoss_6[i]<-0* claim_Claire}




}

PaidLoss1<-sum(PaidLoss_1)/2525
PaidLoss3<-sum(PaidLoss_3)/2525
PaidLoss5<-sum(PaidLoss_5)/2525
PaidLoss7<-sum(PaidLoss_7)/2525

partial output of my numeric matrix

【问题讨论】:

    标签: r montecarlo


    【解决方案1】:

    首先,让我确保我已经围绕您想要做的事情:您有几个列 - 在您的示例中,PaidLoss_1,...,PaidLoss_9,有很多条目。其中一些条目为 0,您希望获取 零的条目的平均值(在每列中)。我说对了吗?

    如果是这样:

    注释 1:在代码的最后,您可能希望避免使用 sum 并除以数字来获得所需的平均值。它显然有效,但它会给您带来风险:如果您曾经更改顶部 n 的值,那么在最好的情况下,您必须在下面编辑几行,并且在最坏的情况下,您会忘记这样做。因此,我建议您使用类似 mean(PaidLoss_1) 的内容来了解​​您的意思。

    现在,您将n 设为 252500,而您最后的分母是 2525,这会使您的均值膨胀 100 倍。也许这就是您想要的;如果是这样,我会推荐mean(PaidLoss_1) * 100,原因与上述相同。

    评论 2:你可以通过子集来做你想做的事。以一个较小的例子作为演示:

    test <- c(10, 0, 10, 0, 10, 0)
    mean(test)                           # gives 5
    test!=0                              # a vector of TRUE/FALSE for which are nonzero
    test[test!=0]                        # the subset of test which we found to be nonzero
    mean(test[test!=0])                  # gives 10, the average of the nonzero entries
    

    中间三行仅作演示;做你想做的唯一必要的行是第一行(声明向量)和最后一行(获取平均值)。因此,您的代码应该类似于 PaidLoss1 &lt;- mean(PaidLoss_1[PaidLoss_1 != 0]),或者可能是 100 倍。

    评论 3:您可能会考虑将您的内容组织到一个数据框中。与其键入PaidLoss_1PaidLoss_2 等,不如将所有这些PaidLoss 内容组织到一个矩阵中。然后,您可以使用[ , ] 索引访问矩阵的元素。这会很有用,因为它会清理一些代码并防止你输入很多东西;然后,您还可以使用诸如apply() 系列函数之类的东西,以使您不必为不同的列(例如均值)一遍又一遍地键入相同的命令。您也可以使用数据框或其他东西来组织它,但是拥有 一些 结构会让您的生活更轻松。

    (并且非常清楚,您的代码正是我刚开始用 R 编写代码时的样子。您可以决定是否值得进行一些优化;这可能只取决于您最终计划多长时间花费在 R.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 2013-02-12
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多