Использование функции интегрирования для нахождения области под непрерывной кривой вероятности — нахождение % завершения маркетинговой кампании?

Я пытаюсь построить модель для прогнозирования ответов на маркетинговые кампании прямой почтовой рассылки. В приведенном ниже коде я смог использовать ответы из предыдущей кампании, чтобы создать плавную кривую (т. е. непрерывную вероятность). Теперь мне нужно найти общую площадь под этой кривой для каждого дня, чтобы я знал, какой процент завершения кампании приходится на данный день. Теоретически использование функции интеграции, а затем поиск разницы между областями с помощью функции diff должно работать. Например, я смогу найти площадь под кривой после 2-го дня и вычесть площадь под кривой после 1-го дня. Зная дополнительную площадь под кривой за каждый день, я смогу определить процент выполнения за каждый день. Проблема в том, что я не могу найти способ интегрировать эту 64-дневную кривую так, чтобы общая плотность равнялась 1.

#vector of direct mail marketing responses over 63 days  
responses <- c(24.16093706,
41.59607507,
68.20083052,
85.19109064,
100.0704403,
58.6600221,
86.08475816,
88.97439581,
65.58341418,
49.25588053,
53.63602085,
47.03620672,
29.71552264,
32.85862747,
31.29118096,
23.67961069,
19.81261675,
18.69300933,
17.25738435,
12.01161679,
12.36734071,
14.32360673,
11.02390849,
9.108021409,
9.647965622,
8.815576548,
5.67225654,
5.739220185,
6.233999138,
5.527376627,
5.024065761,
5.565266355,
4.626749364,
3.480761716,
4.621902301,
4.518554271,
4.075985188,
3.204946787,
3.174020873,
2.966915873,
2.129178828,
2.673009031,
2.410429043,
2.331287075,
2.509300578,
2.13820695,
2.53433787,
1.603934405,
1.555813592,
1.834605068,
1.842905685,
1.454045577,
2.08684322,
1.318276487,
0.807666643,
1.333167088,
1.004526525,
1.180110123,
1.078079735,
1.151394678,
1.426747942,
0.699119833,
0.583347236)


set.seed(2) 
## install.packages("MASS") 
library("MASS")

shape_and_scale <- fitdistr(responses,'weibull')

shape_and_scale

#now use the curve() function, dweibull, and the shape and scale parameters to create a smooth curve 
curve results <- curve(dweibull(x,0.70730466,13.79467490),from=0, to=63)

Теперь мне нужен способ интегрировать эту кривую, чтобы найти площадь под кривой после дня 1, дня 2, дня 3 и т. д. После этого я смогу использовать diff, чтобы найти разницу между днем ​​2 и днем ​​1 и т. д., которую я могу использовать, чтобы найти % завершения кампании после каждого дня. В моем коде выше я обрезал кривую от 0 до 63. Есть ли способ использовать это? Например, если я просто делаю: diff(pweibull(0:63,0.70730466,13.79467490)), я не использую тот факт, что я уже обрезал кривую от 0 до 63, поэтому плотность не увеличивается до 1.

Например:

sum(diff(pweibull(0:63,0.70730466,13.79467490))) равно 0,94, что равнозначно: integrate(dweibull, 0, 63, shape = 0.70730466,scale = 13.79467490)

... но они не используют тот факт, что в первом блоке кода я уже сократил кривую до 63 дней. Мне просто нравится интегрировать это так, чтобы сумма площадей под кривой равнялась 1?

Спасибо


person Ryan Chase    schedule 10.04.2015    source источник
comment
integrate(dweibull,0,63,shape=0.70730466,scale=13.79467490) то, что вы ищете?   -  person nicola    schedule 10.04.2015
comment
Кажется, это то, что я искал. Однако в этом случае, почему сумма не добавляется к 1. Можете ли вы объяснить, что мне здесь не хватает?   -  person Ryan Chase    schedule 13.04.2015
comment
Потому что вы интегрируете от 0 до 63. Чтобы получить 1, вы должны интегрировать от 0 до бесконечности: integrate(dweibull,0,Inf,shape=0.70730466,scale=13.79467490).   -  person nicola    schedule 13.04.2015
comment
Я в замешательстве. Почему dweibull выходит за пределы 63 дней, когда мои данные (содержащиеся в ответах переменных) распространяются только на 63 дня? Как бы вы порекомендовали мне обрезать кривую, чтобы я мог получить интеграл от 63 дней, чтобы добавить к 1?   -  person Ryan Chase    schedule 13.04.2015
comment
На данный момент у вас, похоже, вопрос по статистике, а не по программированию. Ответ Бена Болкера правильно говорит вам, как интегрировать плотность Вейбулла. Тогда, возможно, обратитесь к stats.stackexchange, чтобы узнать, что вам следует делать вместо этого.   -  person Gregor Thomas    schedule 13.04.2015
comment
Кроме того, поработайте над своей терминологией: усечение — это отсечение. Единственное место, где вы усекаете, это интеграл... вы берете распределение Вейбулла, который всегда будет иметь поддержку от 0 до Inf, поэтому вам придется пройти весь путь от 0 до Inf, чтобы быть ровно на 1 под кривой. Если вы остановитесь на 63-м дне, вы усекли и отрезали хвост. Если вы хотите масштабировать эту часть плотности до 1, просто разделите на 0,63. Но вы должны осознавать, что вы делаете и почему вы это делаете, а это не вопрос программирования.   -  person Gregor Thomas    schedule 13.04.2015
comment
@Грегор, я согласен, за исключением, вы не должны делить на 0,63, вы должны делить на pweibull(63,...)   -  person Ben Bolker    schedule 13.04.2015
comment
@BenBolker Ой, да.   -  person Gregor Thomas    schedule 13.04.2015


Ответы (1)


Я думаю, ты ищешь

d0 <- diff(pweibull(0:63,0.70730466,13.79467490))

Если вы просто хотите нормализовать это до 1, разделите его либо на pweibull(63,...), либо на sum(d0) (что одно и то же).

Если вам нужна окончательная категория, включающая все, кроме 63, используйте

d1 <- diff(pweibull(c(0:63,Inf),0.70730466,13.79467490))
sum(d1)   ## 1

Последнее эквивалентно c(d0,1-sum(d0)).

person Ben Bolker    schedule 10.04.2015
comment
Кажется, это то, что я искал. Однако в этом случае при подсчете суммы сумма не прибавляется к 1: sum(diff(pweibull(0:63,0.70730466,13.79467490))) Можете ли вы объяснить, что я здесь упускаю? - person Ryan Chase; 13.04.2015
comment
...никола ответила на этот вопрос. Но я все еще в замешательстве - как бы вы порекомендовали мне обрезать кривую, чтобы я мог получить интеграл от 63 дней, чтобы добавить к 1? ...даже если я добавлю from=0 и to=63, ничего не изменится: sum(diff(pweibull(0:63,0.70730466,13.79467490), from=0, to=63)) - person Ryan Chase; 13.04.2015
comment
Есть ли способ интегрировать кривую, которую я уже сократил на 63 дня, используя: curve results <- curve(dweibull(x,0.70730466,13.79467490),from=0, to=63). По сути, я не хочу, чтобы какая-либо плотность происходила за пределами этого 63-дневного диапазона. Таким образом, я могу взять общее количество ответов, которые, как я думаю, я получу от кампании, и узнать, какой % будет приходить каждый день в общей сложности за 63-дневное окно. - person Ryan Chase; 13.04.2015