मैं ContaminatedMixt पैकेज, CNmixt फ़ंक्शन। मेरा डेटा आयाम 3 से 9 तक है। अधिकांश डेटा को बिना किसी समस्या के क्लस्टर किया जा सकता है, लेकिन मैं लगातार 7D डेटा को क्लस्टर करने के लिए संघर्ष करता हूं।
स्टैंडअलोन रेप्रेक्स को शामिल करने में सक्षम नहीं होने के लिए क्षमा याचना, लेकिन मुझे पता है कि त्रुटि विश्वसनीय रूप से मेरे अपने डेटा के साथ होती है। आप .csv डेटा के माध्यम से डाउनलोड कर सकते हैं गूगल ड्राइव।
त्रुटि को पुन: उत्पन्न करने के लिए:
library(ContaminatedMixt)
df = read.csv (file = "210102_7clickcodas.csv",
header = TRUE,
fileEncoding = "UTF-8-BOM")
df = round(df, 3)
clusters = CNmixt (
df,
G = 2:10,
contamination = TRUE,
model = NULL,
initialization = "kmeans",
parallel = TRUE)
मैं CNmixt से जो करने के लिए कह रहा हूं वह 2 फिट है, फिर 3, फिर 4,..., फिर डेटा के लिए 10 क्लस्टर और सर्वोत्तम क्लस्टरों की संख्या चुनें (एक मानदंड के आधार पर - मैं आईसीएल का उपयोग करता हूं लेकिन बीआईसी, एआईसी , आदि भी विकल्प हैं)। जब मैं इस कोड को चलाता हूं, हालांकि, मुझे हमेशा निम्न त्रुटि आती है:
Error in checkForRemoteErrors(val) :
one node produced an error: BLAS/LAPACK routine 'DGEBAL' gave error code -3
कभी-कभी एक से अधिक नोड त्रुटि उत्पन्न करते हैं, लेकिन त्रुटि संदेश हमेशा समान होता है। मैंने इस समस्या का निवारण करने का प्रयास किया है कि G का कौन सा मान G को प्रत्येक मान को सीमा के बजाय 2:10 श्रेणी में सेट करके समस्या पैदा कर रहा है (G = 2, फिर G = 3, फिर G = 4, आदि)। ऐसा लगता है कि CNmixt 7D डेटा को 4 समूहों में विभाजित नहीं कर सकता है। ऐसा करने से एरर थ्रो हो जाता है और प्रोग्राम चलना बंद हो जाता है।
सबसे महत्वपूर्ण बात, मैं चाहता हूं: a) CNmixt प्रोग्राम को G के किसी भी मान को बाईपास करने के लिए कहें, जिसके परिणामस्वरूप त्रुटि हो और जारी रहे। इसलिए यदि G=4 समस्या होती, तो प्रोग्राम 2 क्लस्टर, 3 क्लस्टर में फ़िट हो जाता, 4 फ़िट करने का प्रयास करता और विफल हो जाता, और फिर आगे बढ़ें 5 क्लस्टर फ़िट करने के लिए। फिटिंग 2:9 क्लस्टर के अंत में यह उन क्लस्टरों की संख्या का चयन करेगा जिन्होंने मानदंड को अनुकूलित किया और सफलतापूर्वक फिट किया गया। मुझे लगता है कि इसमें सीधे CNmixt सोर्स कोड में बदलाव करना शामिल होगा (. CNmixtG2 फ़ंक्शन मुझे लगता है), लेकिन CNmixt स्रोत कोड में हेरफेर किए बिना इसे करने का एक तरीका भी शानदार होगा।
B) यह समझना भी बहुत अच्छा होगा कि क्यों यह त्रुटि होती है। मुझे पता है कि अन्य लोगों ने इस त्रुटि के बारे में पहले भी पूछा है (उदाहरण के लिए, r msm BLAS/LAPACK रूटीन 'DGEBAL' ने एरर कोड -3 दिया), और जो मैंने पढ़ा है उसके आधार पर, एरर कोड -3 का अर्थ यह प्रतीत होता है कि तीसरे INFO पैरामीटर में एक अवैध मान है . लेकिन मेरे लिए यह पता लगाना वास्तव में चुनौतीपूर्ण साबित हुआ है कि CNmixt कोड में 'DGEBAL' फ़ंक्शन को कहां कहा जा रहा है, यह वास्तव में क्या कर रहा है, और यह क्यों विफल हो रहा है।
इसे कैसे करें इस पर कोई सलाह की सराहना की जाएगी!
1 उत्तर
यह तरीका आपके काम आ सकता है। यदि आप CNmixt()
फ़ंक्शन के लिए R कोड देखते हैं तो यह बार-बार CNmixt_main()
फ़ंक्शन को कॉल करता है, हालांकि यह फ़ंक्शन नाम स्थान से निर्यात नहीं किया जाता है। मैंने जो पहला काम किया वह था expand.grid()
का उपयोग करके एक खोज ग्रिड स्थापित करना ताकि क्लस्टरों की संख्या और मॉडलों के सभी संयोजन प्राप्त किए जा सकें।
eg <- expand.grid(G=2:10,
model=c("EII", "VII", "EEI", "VEI", "EVI", "VVI",
"EEE", "VEE", "EVE", "EEV", "VVE", "VEV",
"EVV", "VVV"),
stringsAsFactors=FALSE)
इसके बाद, मैं एक आउटपुट ऑब्जेक्ट (ICS
) को इनिशियलाइज़ करता हूँ और फिर eg
की पंक्तियों पर लूप करता हूँ। प्रत्येक पंक्ति (मॉडल और समूहों की संख्या का एक संयोजन) के लिए, मैं अनुमान लगाता हूं कि मॉडल try()
में लिपटा हुआ है जो इसे बनाता है ताकि यदि कोई मॉडल त्रुटि फेंकता है तो वह लूप को नहीं रोकता है। ऑब्जेक्ट आउट में केवल त्रुटि होगी और यह कक्षा "try-error"
की है। यदि फ़ंक्शन किसी त्रुटि के साथ समाप्त नहीं होता है, तो यह IC मान देता है अन्यथा, यह NA
मानों का एक वेक्टर देता है जो कि IC मानों के वेक्टर के रूप में लंबे समय तक होता है जो अन्यथा वापस किया जाएगा। अंत में, IC मानों को ICS
की एक नई पंक्ति के रूप में जोड़ें जो प्रत्येक मॉडल के लिए मान जमा करता है।
ICS <- NULL
for(i in 1:nrow(eg)){
out <- try(ContaminatedMixt:::CNmixt_main (
df,
G = eg$G[i],
contamination = TRUE,
model = eg$model[i],
initialization = "kmeans",
alphafix = NULL,
alphamin = .5,
seed = NULL,
start.z=NULL,
start.v = NULL,
start = 0,
label = NULL,
AICcond = FALSE,
iter.max = 1000,
threshold = 1e-10,
parallel=FALSE,
eps=1e-100,
verbose=TRUE,
doCV = FALSE))
if(inherits(out, "try-error")){
ics <- rep(NA, 8)
}else{
ics <- unlist(out$models[[1]]$IC)
}
ICS <- rbind(ICS, ics)
}
इसके बाद, हम IC मानों को उन मापदंडों से जोड़ सकते हैं जिन पर हमने खोज की थी।
eg <- bind_cols(eg, as_tibble(ICS))
इसके बाद, हम क्लस्टर आकार के आधार पर सर्वोत्तम ICL मान प्राप्त कर सकते हैं। यह माना जा रहा है कि सबसे अच्छा आईसीएल सबसे छोटा है, अगर यह सबसे बड़ा है तो बस min(ICL, na.rm=TRUE)
को max(ICL, na.rm=TRUE)
से बदल दें
best_per_cluster <- eg %>%
group_by(G) %>%
filter(ICL == min(ICL, na.rm=TRUE)) %>%
arrange(G)
best_per_cluster
# # A tibble: 9 x 10
# # Groups: G [9]
# G model AIC BIC AIC3 CAIC AWE ICL AICc AICu
# <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2 VII 28960. 28854. 28941. 28835. 28653. 28724. 28960. 28940.
# 2 3 EVI 31190. 30955. 31148. 30913. 30511. 30786. 31188. 31145.
# 3 4 VEI 34230. 33984. 34186. 33940. 33518. 33702. 34228. 34183.
# 4 5 EVI 35896. 35504. 35826. 35434. 34763. 35373. 35891. 35818.
# 5 6 EEI 34959. 34629. 34900. 34570. 34004. 34446. 34955. 34894.
# 6 7 EVI 38211. 37663. 38113. 37565. 36625. 37450. 38201. 38099.
# 7 8 EEI 39301. 38870. 39224. 38793. 38054. 38058. 39294. 39215.
# 8 9 EEI 37999. 37518. 37913. 37432. 36607. 37259. 37991. 37902.
# 9 10 EII 34709. 34205. 34619. 34115. 33252. 33900. 34700. 34607.
अंत में, हम सबसे अच्छा मॉडल चुन सकते हैं, फिर से यह मानते हुए कि सबसे अच्छा आईसीएल सबसे छोटा है।
best_per_cluster %>%
ungroup %>%
filter(ICL == min(ICL))
# # A tibble: 1 x 10
# G model AIC BIC AIC3 CAIC AWE ICL AICc AICu
# <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2 VII 28960. 28854. 28941. 28835. 28653. 28724. 28960. 28940.
जाहिर है, प्रति क्लस्टर आकार में सबसे अच्छा मॉडल प्राप्त करना एक अनावश्यक कदम है, लेकिन इसे देखना दिलचस्प हो सकता है।
साथ ही, मैंने आपके अन्य प्रश्न का उत्तर नहीं दिया है कि त्रुटि क्यों होती है। जब मैंने CNmixt()
फ़ंक्शन चलाया, तो मुझे G=10 तक त्रुटि नहीं मिली, लेकिन जब मैंने CNmixt_main()
का उपयोग करके मॉडल चलाया तो मुझे इस प्रक्रिया में पहले त्रुटि मिली (जैसे, G=3 और ईवीई मॉडल के लिए जी = 4)। मेरे विशेष मामले में, त्रुटि उतनी विश्वसनीय नहीं है जितनी आपके लिए है। मेरे सत्र की जानकारी सिर्फ संदर्भ के लिए नीचे है।
> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.4
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
locale:
[1] en_CA.UTF-8/en_CA.UTF-8/en_CA.UTF-8/C/en_CA.UTF-8/en_CA.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ContaminatedMixt_1.3.4.1
loaded via a namespace (and not attached):
[1] Rcpp_1.0.5 pillar_1.4.6 compiler_4.0.3
[4] gower_0.2.1 plyr_1.8.6 class_7.3-17
[7] iterators_1.0.12 tools_4.0.3 rpart_4.1-15
[10] ipred_0.9-9 mclust_5.4.6 lubridate_1.7.9
[13] mixture_1.5.1 lifecycle_0.2.0 tibble_3.0.3
[16] gtable_0.3.0 nlme_3.1-149 lattice_0.20-41
[19] pkgconfig_2.0.3 rlang_0.4.7 Matrix_1.2-18
[22] foreach_1.5.0 rstudioapi_0.11 parallel_4.0.3
[25] mvtnorm_1.1-1 prodlim_2019.11.13 stringr_1.4.0
[28] withr_2.2.0 dplyr_1.0.2 pROC_1.16.2
[31] generics_0.0.2 vctrs_0.3.4 recipes_0.1.12
[34] stats4_4.0.3 nnet_7.3-14 grid_4.0.3
[37] caret_6.0-86 tidyselect_1.1.0 data.table_1.13.0
[40] glue_1.4.2 R6_2.4.1 survival_3.2-7
[43] lava_1.6.7 reshape2_1.4.4 ggplot2_3.3.2
[46] purrr_0.3.4 magrittr_1.5 ModelMetrics_1.2.2.2
[49] splines_4.0.3 MASS_7.3-53 scales_1.1.1
[52] codetools_0.2-16 ellipsis_0.3.1 mnormt_2.0.1
[55] timeDate_3043.102 colorspace_1.4-1 stringi_1.5.3
[58] munsell_0.5.0 tmvnsim_1.0-2 crayon_1.3.4