2016-09-14 5 views
1

кажется, что для больших N (скажет 2e6) cut2 функции в Hmisc пакета выдает ошибкуИспользование cut2 в пакете Hmisc для большого N

y = cut2(rnorm(2000000,0,1),m=sqrt(2000000)) 

Error in if (cj == upper) next : missing value where TRUE/FALSE needed 
In addition: Warning message: 
In (1:g) * nnm : NAs produced by integer overflow 

Я пытаюсь получить квантили моих данных, с m точек в каждом квантиле, а также записывать конечные точки каждого квантиля. cut2 делает, но не очень хорошо для большой N. Есть ли лучшие альтернативы?

ответ

1

Это то, что вы хотите?

cut3 = function(x, m) { 
    p = seq(0, 1, by = m/length(x)) 
    q = quantile(x, probs = p, names = F) 
    result = cut(x, breaks = q) 
} 

Тестирование это:

x = rnorm(2e6) 
m = sqrt(2e6) 
qq = cut3(x, m) 
summary(as.numeric(table(qq))) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. 
# 1414 1414 1414 1414 1414 1415 
head(qq) 
# [1] (0.4757,0.4779] (-1.021,-1.018] (0.4325,0.4344] (1.376,1.381] (-2.156,-2.138] (0.1215,0.1233] 
# 1414 Levels: (-4.964,-3.196] (-3.196,-2.981] (-2.981,-2.86] (-2.86,-2.766] (-2.766,-2.696] (-2.696,-2.637] ... (3.145,3.607] 
+0

Есть некоторые незначительные различия, как и я начинаю видеть. 'cut2' использует' m' как минимальное количество наблюдений в каждом бункере, тогда как 'cut3' заставляет каждый ящик иметь точно такое же количество наблюдений. Последнее приводит к тому, что некоторые наблюдения не помещаются в бункеры. Можно ли изменить это с помощью 'quantile' и' cut'? – stats134711