【问题标题】:Manually calculate variance from count data for categorical ratings手动计算分类评级的计数数据的方差
【发布时间】:2017-08-02 14:13:29
【问题描述】:

我正在尝试根据分类评分计数数据手动计算方差(和均值)。

Item <- c("A", "B", "C", "D")
cat1 <- c(4,12,17,NA)
cat2 <- c(NA,10,20,15)
cat3 <- c(17,5,12,6)
cat4 <- c(10,12,17,NA)
cat5 <- c(3,21,NA,16)
cat6 <- c(2,14,12,20)
cat7 <- c(7,NA,18,23)

Data <- data.frame(Item=Item, Never=cat1,Rarely=cat2,Occasionally=cat3, Sometimes=cat4,Frequently=cat5,Usually=cat6,Always=cat7,stringsAsFactors=FALSE)

Data

  Item Never Rarely Occasionally Sometimes Frequently Usually Always
1    A     4     NA           17        10          3       2      7
2    B    12     10            5        12         21      14     NA
3    C    17     20           12        17         NA      12     18
4    D    NA     15            6        NA         16      20     23

每个分类评级都有一个等效的数值 (1:7)。我计算了每个项目的平均数值评分如下:

Rating_wt <- 1:7 # Vector of weights for each frequency rating
Rating.wt.mat <- rep(Rating_wt,each=dim(Data[,2:8])[1])
Data$Avg_rating <- rowSums(Data[,2:8]*Rating.wt.mat,na.rm=TRUE)/rowSums(Data[,2:8],na.rm=TRUE)

Data

  Item Never Rarely Occasionally Sometimes Frequently Usually Always Avg_rating
1    A     4     NA           17        10          3       2      7   3.976744
2    B    12     10            5        12         21      14     NA   3.837838
3    C    17     20           12        17         NA      12     18   3.739583
4    D    NA     15            6        NA         16      20     23   5.112500

我还想计算每个平均值的方差并将其作为新变量存储在数据中。

我认为我需要从每个数字评分中减去每个项目的平均值,然后将该值乘以每个相应单元格中的计数,然后将这些结果跨行相加,然后除以每行中的总计数。

但是,我不知道如何设置元素计算来实现这一点。

从概念上讲,我认为应该是这样的:

Data$Rating_var <- rowSums((Numeric_Rating - Avg_rating)*Value,na.rm=TRUE)/rowSums(Data[,2:8],na.rm=TRUE))

其中Numeric_Rating对应Rating_wt

Never = 1
Rarely = 2
Occasionally = 3
Sometimes = 4
Frequently = 5
Usually = 6
Always = 7

Value 是每个Numeric_RatingItem 交叉点对应的单元格。

【问题讨论】:

    标签: r


    【解决方案1】:

    我建议您在应用计算之前尝试重塑数据集,因为这样会更容易。

    library(dplyr)
    library(tidyr)
    
    
    Item <- c("A", "B", "C", "D")
    cat1 <- c(4,12,17,NA)
    cat2 <- c(NA,10,20,15)
    cat3 <- c(17,5,12,6)
    cat4 <- c(10,12,17,NA)
    cat5 <- c(3,21,NA,16)
    cat6 <- c(2,14,12,20)
    cat7 <- c(7,NA,18,23)
    
    Data <- data.frame(Item=Item, Never=cat1,Rarely=cat2,Occasionally=cat3, Sometimes=cat4,Frequently=cat5,Usually=cat6,Always=cat7,stringsAsFactors=FALSE)
    
    
    Data %>%
      gather(category, value, -Item) %>%                                                  # reshape dataset
      mutate(Rating = recode(category, "Never"=1,"Rarely" = 2,"Occasionally" = 3,         
                                       "Sometimes" = 4,"Frequently" = 5,
                                       "Usually" = 6,"Always" = 7)) %>%                   # assign rating 
      group_by(Item) %>%                                                                  # for each item
      mutate(Avg = sum(Rating*value, na.rm=T) / sum(value, na.rm=T),                      # calculate Avg
             variance = sum(abs(Rating - Avg)*value, na.rm=T) / sum(value, na.rm=T)) %>%  # calculate Variance using the Avg
      ungroup() %>%                                                                       # forget the grouping
      select(-Rating) %>%                                                                 # no need the rating any more
      spread(category, value) %>%                                                         # reshape back to original form
      select_(.dots = c(names(Data), "Avg", "variance"))                                  # get columns in the desired order
    
    
    # # A tibble: 4 x 10
    #    Item Never Rarely Occasionally Sometimes Frequently Usually Always      Avg variance
    # * <chr> <dbl>  <dbl>        <dbl>     <dbl>      <dbl>   <dbl>  <dbl>    <dbl>    <dbl>
    # 1     A     4     NA           17        10          3       2      7 3.976744 1.326122
    # 2     B    12     10            5        12         21      14     NA 3.837838 1.530314
    # 3     C    17     20           12        17         NA      12     18 3.739583 1.879991
    # 4     D    NA     15            6        NA         16      20     23 5.112500 1.529062
    

    尝试逐步运行管道进程,看看它是如何工作的,尤其是在您不熟悉 dplyrtidyr 语法的情况下。

    【讨论】:

    • 我收到上述错误:Error in recode(category, Never = 1, Rarely = 2, Occasionally = 3, Sometimes = 4, : unused arguments (Never = 1, Rarely = 2, Occasionally = 3, Sometimes = 4, Frequently = 5, Usually = 6, Always = 7)
    • 我通过显式调用 dplyr recode 和 select 函数修复了未使用的参数错误。但是,对于所有四个项目,我得到相同的平均值和方差值。
    • 经过一番搜索,我尝试分离 plyr - 问题解决了!谢谢!
    • 我最初的方差计算错误。使用接受的答案,应该是mutate(Avg_freq_score = sum(Rating*value, na.rm=T) / sum(value, na.rm=T), # calculate Avg Freq_var = sum(((Rating - Avg_freq_score)^2)*value, na.rm=T) / sum(value, na.rm=T))
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多