R: Цикл команды для поиска числовой переменной, которая увеличивается в каждой итерации, пока сумма не сходится к данному целому числу - PullRequest
0 голосов
/ 02 октября 2018

Я никогда не использовал R для вычисления числа путем итерации.Я искал решение с синтаксисом «цикл до» и не смог.Возможно, это можно сделать с помощью чего-то похожего на «fsolve» в Matlab.

У меня есть следующее (упрощенное) data.table:

head(db)
    client_id Price Quantity Ai_SR
1: 0100003801 2.802      160 197.2983
2: 0100003802 2.802      142 178.1377
3: 0100003803 2.802      240 196.0487
4: 0100003804 2.802       75 175.2219
5: 0100003805 2.802      145 208.5448
6: 0100010401 2.802      159 362.6629

Начиная с P_bar = 1, я хочуповторите следующую команду:

sum(db[, (Ai_SR * P_bar^(-0.15)) * P_bar])

До sum(db[, (Ai_SR * P_bar^(-0.15)) * P_bar]) = 8493853224.

Как написать команду, которая делает это, увеличивая P_bar на 0,01 в каждой итерации?

Более того, я уверен, что сумма никогда не будет точно сходиться к 8493853224.Поэтому я думаю, что мне придется зацикливать команду до тех пор, пока сумма не станет строго больше, чем 8493853224, и просто сохранить последние P_bar до того, как сумма будет больше, чем 8493853224.

Я полагаю, что смогускопируйте и вставьте команду и замените P_bar на 1, 1.01, 1.02, ..., пока сумма не приблизится к 8493853224.Есть ли любитель способ сделать это?

Я прошу прощения, если этот вопрос был задан ранее.В свою защиту, я не мог найти ничего похожего, ища решения типа петли.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Способ выполнения того, что вы описали программно, называется циклом while, продемонстрированным в ответе djchapman .Тем не менее, если вы хотите стать еще более «любопытным» (и гораздо более эффективным для больших задач), вы можете просто поработать над математикой:

Ваша цель - найти P_bar, такой, что сумма всех db$Ai_SR[i] * P_bar^(-0.15) * P_bar равно определенной константе (здесь 8493853224).Пусть эта константа будет X .Тогда

sum(db$Ai_SR * P_bar^(-0.15) * P_bar) = X 
sum(db$Ai_SR * P_bar^0.85) = X  
P_bar^0.85 * sum(db$Ai_SR) = X  
P_bar^0.85 = X / sum(db$Ai_SR)  
P_bar = (X / sum(db$Ai_SR))^(1/0.85)

Хотя 8493853224 может быть разумным числом для вашего полного набора данных, для шести опубликованных вами наблюдений оно немного выше.Итак, давайте использовать более разумный X = 5000 например:

## Read in the example data
db <- read.table(header = TRUE, text = "
 client_id Price Quantity Ai_SR
1: 0100003801 2.802      160 197.2983
2: 0100003802 2.802      142 178.1377
3: 0100003803 2.802      240 196.0487
4: 0100003804 2.802       75 175.2219
5: 0100003805 2.802      145 208.5448
6: 0100010401 2.802      159 362.6629")

## Apply the formula
(5000 / sum(db$Ai_SR))^(1/0.85)
# [1] 4.800361

## and check it against a naive while loop
P_bar <- 1
x <- sum(db$Ai_SR * (P_bar^0.85))
while ( x < 5000 ) {
  P_bar <- P_bar + 0.01
  x <- sum(db$Ai_SR * (P_bar^0.85))
}
P_bar
# [1] 4.81
0 голосов
/ 02 октября 2018
calculation_max = 8493853224
step = 0.01
P_bar = 1 
while(calculation < calculation_max){
  calculation = sum(db[, Quantity * (P_bar^0.15)])
  P_bar = P_bar + step
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...