Использование компонента символьного вектора в качестве аргумента функции R.

#r #kolmogorov-smirnov

#r #колмогоров-смирнов

Вопрос:

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

 install.packages("ISLR")
library(ISLR)
attach(Credit)
distr.list <- c("pbeta","pbinom","pcauchy","pchisq")
p.val <- double(length(distr.list))
for (i in 1:length(distr.list))
   {
    p.val[i] <- ks.test(Income,distr.list[i])$p.value 
   }
 

Я получаю:

 Error in y(sort(x), ...) : argument "shape1" is missing, with no default
 

Что это значит? В чем моя ошибка? Заранее большое спасибо.

 sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)
 

Комментарии:

1. Несмотря на ваше утверждение, я считаю, что это просто проблема кодирования R, а не статистический вопрос. ks.test() Функция ожидает ряд числовых значений и другой ряд числовых значений или именованное распределение, как и вы. В более позднем случае иногда требуется указать дополнительные параметры, как указано в документе: ...: parameters of the distribution specified (as a character string) by ‘y’. , что имеет место для pbeta поскольку он ожидает shape1, shape2: non-negative parameters of the Beta distribution. .

Ответ №1:

Используйте явные функции распределения, как в

 distr.list <- list(
  pbeta = function(x) pbeta(x, 1, 2),
  pbinom = function(x) pbinom(x, 8, 3),
  pcauchy = pcauchy,
  pchisq = function(x) pchisq(x, 4)
)
p.val <- double(length(distr.list))
for (i in 1:length(distr.list))
{
  p.val[i] <- ks.test(Income,distr.list[[i]])$p.value 
}
# Optional:
names(p.val) <- names(distr.list)
 

Обратите внимание на [[ индексацию списка в цикле. Фактические значения параметров в этом примере являются чистыми измышлениями — вам нужно будет указать значения, подходящие для ваших целей и предположений.


Хотя это заставит ваш код выполняться, он не будет статистически корректным, но это другой набор проблем. В частности, какой смысл было бы использовать дискретные распределения, такие как биномиальные, непрерывные ограниченные распределения, такие как бета, и непрерывные неограниченные распределения, такие как все Коши, в качестве эталонных распределений для оценки данного набора данных?

Обширное сравнение (с помощью некоторого теста распределения, такого как KS) набора распределений с данными, как показано в этом коде, обычно не является хорошим подходом к подбору распределения. Подгонка распределения обычно заключается в оценке набора параметров для определения разумного диапазона распределений в семействе предполагаемых моделей распределения. То, как это делается, является важной частью того, что такое статистика.

Комментарии:

1. Большое спасибо, @whuber.