Статистикийн R програмын ямар нэг нэмэлт багц / пакет / package суулгах гэтэл тэр нь CRAN зэрэг агуулах дээр байхгүйтэй тааралдаж байв уу? Нэрээр нь хайж үзэхэд дараах зураг дээрх шиг хуудас харж байв уу?

Энэ бол тухайлбал compoisson гэдэг багц статистикийн R програмын нэмэлт багцуудын үндсэн агуулах болох CRAN дээрээс хасагдсаныг илэрхийлнэ. R програм болон тухайн багцыг хөгжүүлэхэд ашигласан зарим багцын хөгжүүлэлтийн явцад тус багц ямар нэг шаардлага хангахгүй болох явдал гардаг. Жишээ болгон авч үзсэн багцын хувьд лицензийн өөрчлөлттэй холбогдох шаардлагын дагуу шинэчлэгдээгүй учраас хасагджээ. Ийнхүү хасагдсан багцыг түүнтэй нийцэх R програм дээр суулгах эсвэл эх кодоор нь суулгах зэргээр цаашид ашиглах боломж бий.

Ийнхүү хасагдсан багцыг ашиглах шаардлага тулгарвал архиваас нь татан авч суулгаад хэрэглэх боломжтой. Дээрх зурагт archive гэсэн холбоос буйг ажиглана уу. Татан авсан эх кодыг RStudio програмын тусламжтай суулгахаар зэхчихээд буйг дараах зурагаар харууллаа. Улмаар Install товчлуур дарж тус багцыг R програмд нэмж суулгана.

Жич: Ийнхүү суулгах явцад янз бүрийн алдаа гарч болно. Тус багцын хувьд лицензийн шинэчлэлт гэснээс өөр шальтай шалтгаан байгаагүй бололтой буюу суулгахад алдаа гараагүй. Үүнээс өөр багцын хувьд суулгахад алдаа гарч болохыг санаарай.

CRAN-аас хасагдсан багцын хувьд түүнийг суулгах нь ердөө эхний даваа юм. Суулгасны дараа түүнийг хэрэглэх явцад ч ямар нэг асуудал гарах магадлалтай. Энд авч үзэж буй compoisson багцын хувьд түүний нэг бүрдэл хэсэг болох com.fit() функцийг дуудаж ажиллуулахад дараах алдаа гарч байсан.

Error in x < 0 || x != floor(x) : 
  'length = 5' in coercion to 'logical(1)'

Энэ бол бүр тус багцын өөрийнх нь жишээг ажиллуулахад гарсан алдаа юм шүү. Миний шинжилж байсан өгөгдөл тус функцийн шаардлагыг хангахгүй байгаа юм болов уу гэж мэл гайхаж цэл хөхрөхдөө өөрийнх нь жишээг зориуд ажиллуулж үзсэн юм. Ингэхэд ч яг адилхан гарсан нь энэ л дээ.

Ийм тохиолдолд функцийн кодыг задалж үзэж байгаад шаардлагатай хэсгээ сугалж аваад ажиллуулах байдлаар аргалах боломж бий. R програм нь өөрөө үнэгүй, нээлттэйн дээр лицензийн шаардлагынх нь дагуу нэмэлт багцууд нь ч үнэгүй, эх код нь нээлттэй байдаг. Иймээс алдаа заагаад буй кодыг нь өөрийнхөө нөхцөл байдал болон гарсан алдаанаас нь хамааруулж аргалаад ажиллуулах боломж байдаг.

Функцийн эх кодыг харах хамгийн хялбар арга бол тус функцийг хаалтгүйгээр өөрөөр хэлбэл зүгээр л com.fit гэж дуудах явдал юм. Энэхүү функцийн эх код дараах байдалтай байв.

function (x) 
{
    xbar = (x[, 1] %*% x[, 2])/sum(x[, 2])
    options(warn = -1)
    result = optim(c(xbar, 1), function(p) {
        return(-com.loglikelihood(x, p[1], p[2]))
    }, method = "L-BFGS-B", lower = c(1e-10, 0))
    options(warn = 0)
    lambda = result$par[1]
    nu = result$par[2]
    fit = list(lambda = lambda, nu = nu, z = com.compute.z(lambda, 
        nu), fitted.values = sum(x[, 2]) * dcom(x[, 1], lambda, 
        nu), log.likelihood = com.loglikelihood(x, lambda, nu))
    return(fit)
}
<bytecode: 0x55d71761ca98>
<environment: namespace:compoisson>

Эндээс надад зөвхөн Конвей-Максвелл-Пуассоны тархалтын lambda болон nu параметрийн хамгийн их үнэний хувь бүхий үнэлэлт л шаардлагатай байсан тул дээрх кодоос дор ялгаж бичсэн хэсгийг л ажиллуулсан.

xbar = (x[, 1] %*% x[, 2])/sum(x[, 2])
result = optim(c(xbar, 1), function(p) {
  return(-com.loglikelihood(x, p[1], p[2]))
}, method = "L-BFGS-B", lower = c(1e-10, 0))
lambda = result$par[1]
nu = result$par[2]

Ийнхүү ажиллуулахад алдаа гараагүй. Өөрөөр хэлбэл дээрх алдаа функцийн төгсгөл хэсгээс илэрсэн.

Ийм байдлаар ажиллахгүй байсан функцийг "ажиллуулж" өөрт шаардлагатай үр дүнгээ гарган авч болох юм. Улмаар com.fit() функцийн алдааны шалтгаан хаана байсныг нягталж үзэхэд dcom() функцтэй холбоотой байлаа. Тус функцийн баримтжуулалтыг үзэхэд энэ бол Конвей-Максвелл-Пуассоны тархалтын нягтын функцийн утга олох функц гэжээ. Цааш нь энэхүү функцийн эх кодыг харав.

function (x, lambda, nu, z = NULL) 
{
    if (lambda < 0 || nu < 0) 
        stop("Invalid arguments, only defined for lambda >= 0, nu >= 0")
    if (x < 0 || x != floor(x)) 
        return(0)
    if (is.null(z) || z <= 0) 
        z = com.compute.z(lambda, nu)
    return((lambda^x) * ((factorial(x))^-nu)/z)
}
<bytecode: 0x55d7176046e0>
<environment: namespace:compoisson>

Энд эхлээд параметрийн утгыг шалгаж байна. Дараа нь нягтыг нь бодох санамсаргүй хувьсагчийн утгуудын сөрөг эсвэл бутархай тоо эсэхийг шалгах зорилготой код бичжээ. Нөгөө алдааны шалтгаан чухам энд л байна. Функцийн буцаах утга болох нягтыг тооцоолж буй байдлыг харвал x аргументыг вектор байхыг дэмжжээ. Угаасаа R програмын stats багц дахь, тархалтын нягтын функцийн утга буцаадаг функцүүд цөм вектор аргумент дэмждэг л дээ. Уг функцийн буцаах утгыг харвал энэ жишиг ажиглагдаж л байна. Гэтэл хоёр дахь if оператор доторх илэрхийллийг харвал үүнтэй зөрчилдөж байна. R хэлний if оператор скаляр логик утгатай илэрхийллийг л хүлээж авдаг. Гэтэл энд вектор байдалтай логик утга ороод ирж болохоор харагдана. Улмаар return(0) гэсэн нь x аргументийг скаляр гэж хатуу "итгэсэн" гэлтэй. Гэвч dcom() функцийг com.fit() функц дотроос дуудсан тул вектор байдалтай аргумент дамжиж орж ирэх нь гарцаагүй юм. Иймд тэдгээрийг ядаж л дараах байдлаар өөрчлөх хэрэгтэй.

if (any(x < 0 | x != floor(x)))
  stop("Invalid arguments, only defined for non-negative integer x values")

Энэ нь ядаж нэг сөрөг юм уу бутархай тоон утга илэрвэл алдаа зааж зохих мэдэгдэл хэвлэнэ.

Ерөнхийдөө ийм байдлаар CRAN дээрээс хасагдсан багцыг суулгаж бас ажиллахгүй байгаа функцийг нь аргалж ажиллуулна. Гэхдээ суулгах болон аргалж ажиллуулах байдал нь тухайн нөхцөл байдлаас шалтгаалж янз бүрээр хэрэгжихийг санаарай. Ийм тохиолдол бүрийг амжилттай даван гарахын тулд мэдээж R хэлний гүнзгий мэдлэг шаардлагатай. Та R хэлийг мэргэжлийн өндөр түвшинд сурах хүсэл эрмэлзэлтэй бол миний бичиж хэвлүүлсэн Статистик програмчлалын R хэл номыг уншиж судлаарай.