Matrice help: Нахождение среднего без нулей - PullRequest
0 голосов
/ 26 февраля 2020

Я создаю модель Монте-Карло, используя 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

частичный вывод моей цифры c матрица

1 Ответ

0 голосов
/ 26 февраля 2020

Во-первых, позвольте мне убедиться, что я обернул голову вокруг того, что вы хотите сделать: у вас есть несколько столбцов - в вашем примере 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 <- mean(PaidLoss_1[PaidLoss_1 != 0]), или, может быть, в 100 раз.

Комментарий 3 : Вы можете подумать о том, чтобы организовать свои вещи в информационный фрейм. Вместо ввода PaidLoss_1, PaidLoss_2 и т. Д. 1042 *, возможно, имеет смысл организовать все эти PaidLoss вещи в матрицу. Затем вы можете получить доступ к элементам матрицы с индексированием [ , ]. Это было бы полезно, потому что это очистило бы часть кода и предотвратило бы необходимость печатать много вещей; затем вы также можете использовать такие вещи, как семейство функций apply(), чтобы избавить вас от необходимости вводить одни и те же команды снова и снова для разных столбцов (например, среднего). Вы также можете использовать фрейм данных или что-то еще для его организации, но наличие некоторой структуры сделает вашу жизнь проще.

(И, чтобы быть супер ясным, ваш код - это именно то, что выглядел мой код например, когда я впервые начал писать в R. Вы можете решить, стоит ли заниматься какой-то из этих оптимизаций, возможно, это просто зависит от того, сколько времени вы планируете потратить в R.)

...