แพ็คเกจ R สำหรับการรวมระดับปัจจัยสำหรับการจัดทำดัชนี?


10

หากสงสัยว่ามีใครวิ่งข้ามแพ็คเกจ / ฟังก์ชั่นใน R ที่จะรวมระดับของปัจจัยที่มีสัดส่วนของระดับทั้งหมดในปัจจัยน้อยกว่าขีด จำกัด บางอย่าง? โดยเฉพาะอย่างยิ่งหนึ่งในขั้นตอนแรกในการเตรียมข้อมูลที่ฉันดำเนินการคือการยุบปัจจัยที่กระจัดกระจายในระดับต่างๆ (พูดในระดับที่เรียกว่า 'อื่น ๆ ') ที่ไม่ได้ประกอบด้วยอย่างน้อย 2% ของทั้งหมด สิ่งนี้ทำโดยไม่ได้รับอนุญาตและทำเมื่อวัตถุประสงค์คือเพื่อจำลองกิจกรรมบางอย่างในการตลาด (ไม่ใช่การตรวจจับการฉ้อโกงซึ่งเหตุการณ์เหล่านั้นมีความสำคัญน้อยมาก) ฉันกำลังมองหาฟังก์ชั่นที่จะยุบระดับจนกระทั่งได้สัดส่วนตามเกณฑ์

UPDATE:

ขอบคุณคำแนะนำที่ดีเหล่านี้ฉันเขียนฟังก์ชั่นได้อย่างง่ายดาย ฉันรู้ว่ามันเป็นไปได้ที่จะยุบระดับด้วยสัดส่วน <ต่ำสุดและยังคงมีระดับที่ถูกถอดรหัสเป็น <ต่ำสุดซึ่งต้องการการเพิ่มระดับต่ำสุดพร้อมสัดส่วน> ต่ำสุด มีแนวโน้มที่จะมีประสิทธิภาพมากขึ้น แต่ดูเหมือนจะทำงาน การปรับปรุงต่อไปคือการหาวิธีจับ "กฎ" สำหรับการใช้ตรรกะการยุบกับข้อมูลใหม่ (ชุดการตรวจสอบหรือข้อมูลในอนาคต)

collapseFactors<- function(tableName,minPercent=5,fillIn ="RECODED" )
{
    for (i in 1:ncol(tableName))
        {   

            if(is.factor(tableName[,i]) == TRUE) #process just factors
            {


                sortedTable<-sort(prop.table(table(tableName[,i])))
                numberToCollapse<-length(sortedTable[sortedTable<(minPercent/100)])

                if (sum(sortedTable[1:numberToCollapse])<(minPercent/100))
                    {
                        numberToCollapse=numberToCollapse+1 #add next level if < minPercent
                    }

                if(numberToCollapse>1) #if not >1 then nothing to collapse
                {
                    lf <- names(sortedTable[1:numberToCollapse])
                    levels(tableName[,i])[levels(tableName[,i]) %in% lf] <- fillIn
                }
            }#end if a factor


        }#end for loop

    return(tableName)

}#end function

สำหรับวิธีอื่น: stats.stackexchange.com/questions/227125/ …
kjetil b halvorsen

คำตอบ:


11

ดูเหมือนว่าเป็นเพียงเรื่องของ "ปัจจัยที่เกี่ยวข้อง" เท่านั้น ไม่จำเป็นต้องคำนวณผลรวมบางส่วนหรือทำสำเนาของเวกเตอร์ดั้งเดิม เช่น,

set.seed(101)
a <- factor(LETTERS[sample(5, 150, replace=TRUE, 
                           prob=c(.1, .15, rep(.75/3,3)))])
p <- 1/5
lf <- names(which(prop.table(table(a)) < p))
levels(a)[levels(a) %in% lf] <- "Other"

ที่นี่ระดับปัจจัยดั้งเดิมมีการกระจายดังนี้:

 A  B  C  D  E 
18 23 35 36 38 

แล้วมันก็จะกลายเป็น

Other     C     D     E 
   41    35    36    38 

มันอาจถูกห่อหุ้มอย่างสะดวกในฟังก์ชั่น มีcombine_factor()ฟังก์ชั่นในแพ็คเกจreshapeดังนั้นฉันคิดว่ามันก็มีประโยชน์เช่นกัน

นอกจากนี้ในขณะที่คุณสนใจทำ data data คุณอาจจะได้ดูแพ็กเกจcaret มันมีจำนวนมากของคุณสมบัติที่มีประโยชน์สำหรับข้อมูล preprocessing รวมทั้งฟังก์ชั่นเหมือนnearZeroVar()ที่ช่วยให้การพยากรณ์ธงที่มีการกระจายขาดดุลมากของค่าสังเกต (ดูบทความของข้อมูลตัวอย่างเช่น preprocessing ฟังก์ชั่นการสร้างภาพและฟังก์ชั่นอื่น ๆพี. 5 ยกตัวอย่างเช่น การใช้งาน)


@CHI ขอบคุณ ฉันได้ศึกษาแพ็คเกจคาเร็ตและใช้มันเพื่อปรับแต่งพารามิเตอร์เมตา มีประโยชน์มาก!.
B_Miner

@chl +1 เป็นคนดี ฉันเขียนฟังก์ชันของฉันเพียงอย่างเดียวเพราะรหัส a [ระดับ (a)% ใน% lf] <- "อื่น ๆ " ใช้งานไม่ได้ดังนั้นฉันจึงสันนิษฐานว่าการเปลี่ยนแปลงระดับปัจจัยนั้นซับซ้อน ตามปกติมันกลับกลายเป็นว่า R ไม่ซับซ้อนฉันเป็น :)
mpiktas

@mpiktas ขอบคุณ คุณสามารถทำงานในระดับเวกเตอร์ด้วยเช่น, a[as.character(a) %in% lf] <- lf[1]; a <- factor(droplevels(a), labels=c("Other",LETTERS[3:5])).
chl

+1 a [levels (a)% ใน% lf] <- "อื่น ๆ " แน่นอนว่าจะช่วยประหยัดบรรทัดโค้ดจำนวนหนึ่ง ฉลาดและมีประสิทธิภาพ!
Christopher Aden

แต่โปรดทราบว่า [a == "a"] <- "อื่น ๆ " จะไม่ทำงานซึ่งสำหรับฉันค่อนข้างเป็นธรรมชาติที่จะคิดว่าควร โดยเฉพาะอย่างยิ่งเนื่องจาก [a == "a"] นั้นถูกต้องสมบูรณ์
mpiktas

5

ปัญหาเดียวของคริสโตเฟอร์คือคำตอบว่ามันจะรวมการเรียงลำดับดั้งเดิมของปัจจัย นี่คือการแก้ไขของฉัน:

 Merge.factors <- function(x, p) {
     t <- table(x)
     levt <- cbind(names(t), names(t)) 
     levt[t/sum(t)<p, 2] <- "Other"
     change.levels(x, levt)
 }

ซึ่งchange.levelsเป็นฟังก์ชั่นดังต่อไปนี้ ฉันเขียนเมื่อไม่นานมานี้ดังนั้นฉันสงสัยว่าอาจจะมีวิธีที่ดีกว่าในการบรรลุสิ่งที่ทำ

 change.levels <- function(f, levt) {
     ##Change the the names of the factor f levels from
     ##substitution table levt.
     ## In the first column there are the original levels, in
     ## the second column -- the substitutes
     lv <- levels(f)
     if(sum(sort(lv) != sort(levt[, 1]))>0)
     stop ("The names from substitution table does not match given level names")
     res <- rep(NA, length(f))

     for(i in lv) {
          res[f==i] <- as.character(levt[levt[, 1]==i, 2])
     }
     factor(res)
}

4

ฉันเขียนฟังก์ชันด่วนที่จะทำให้บรรลุเป้าหมายนี้ ฉันเป็นผู้ใช้ R มือใหม่ดังนั้นจึงอาจช้ากับตารางขนาดใหญ่

Merge.factors <- function(x, p) { 
    #Combines factor levels in x that are less than a specified proportion, p.
    t <- table(x)
    y <- subset(t, prop.table(t) < p)
    z <- subset(t, prop.table(t) >= p)
    other <- rep("Other", sum(y))
    new.table <- c(z, table(other))
    new.x <- as.factor(rep(names(new.table), new.table))
    return(new.x)
}

เป็นตัวอย่างของการดำเนินการ:

> a <- rep("a", 100)
> b <- rep("b", 1000)
> c <- rep("c", 1000)
> d <- rep("d", 1000)
> e <- rep("e", 400)
> f <- rep("f", 100)
> x <- factor(c(a, b, c, d, e, f))
> summary(x)
   a    b    c    d    e    f 
 100 1000 1000 1000  400  100 
> prop.table(table(x))
x
         a          b          c          d          e          f 
0.02777778 0.27777778 0.27777778 0.27777778 0.11111111 0.02777778 
> 
> w <- Merge.factors(x, .05)
> summary(w)
    b     c     d     e Other 
 1000  1000  1000   400   200 
> class(w)
[1] "factor"

ขอบคุณสำหรับการสังเกตจอห์น ฉันเปลี่ยนมันเล็กน้อยเพื่อให้เป็นปัจจัย สิ่งที่ฉันทำคือสร้างเวกเตอร์ดั้งเดิมจากตารางใหม่ดังนั้นหากมีวิธีที่จะข้ามขั้นตอนนั้นไปได้สิ่งนี้จะเร็วขึ้น
Christopher Aden

ขอบคุณทุกคนที่ตอบกลับ R ของฉันอ่อนแอ แต่ความสามารถในการทำเช่นนี้ด้วยโค้ดไม่กี่บรรทัดเป็นเครื่องพิสูจน์ว่ามันมีประสิทธิภาพเพียงใดและทำให้ฉันต้องการเรียนรู้
B_Miner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.