根据因子水平自动为变量分配权重

问题描述 投票:0回答:2

我在表达我的问题时遇到了一些问题,所以我使用 mtcars 数据集作为示例。

想象一下,我是 Pixar Cars(TM) 宇宙中的社会科学专业的学生。对于一个关于统计方法的小型学校项目,我正在同龄人中进行调查。我的目标是收集 30 辆汽车样本的数据,其中一半是自动的,另一半是手动的。在我的在线调查结束后,我清理了我的数据,它看起来像 mtcars 数据集。

data(mtcars)
str(mtcars)
mtcars$am <- as.factor(mtcars$am)
levels(mtcars$am) <- c("automatic", "manual") # because anthropomorphic cars prefer factors with levels over binary code 

如果我使用

table(mtcars$am)
,我发现数据集中有 19 辆自动变速器汽车和 13 辆手动变速器汽车。看起来我没有让你的目标是拥有相同数量的手动和自动汽车 :(!幸运的是,作为一名汽车社会学家,我可以通过权衡我的数据集来解决这个问题。我将目标 # 除以收集的 # 得到每个观察的权重。因此,所有自动驾驶汽车的权重应为 0.7894 (15/19),而手动汽车的权重应为 1.1538 (13/15)。为每个观察分配正确的权重非常简单:

mtcars$weight <- ifelse(mtcars$am == "automatic", 0.7894737, 1.153846)

您可以想象,对于具有更多权重类别的更大数据集,此方法会变得有点麻烦。有没有办法自动化为每个观察分配权重的过程?

作为一名主要根据需要拼凑东西的汽车和自学 R 用户,我真的不知道从哪里开始。我一直在使用上面的方法,但由于目标群体数量的增加,它不再真正可持续了。

我当然尝试在 WWW 的其他地方找到答案,但不幸的是不是很成功。以下问题似乎很有希望,但没有为我提供解决方案:

R:基于另一个变量的因子水平的新变量值

r weighted
2个回答
1
投票

在这个例子中,我们添加了每个传输组的计数,然后通过将您的预期组大小(总数的一半)除以观察到的组大小(计数)来创建一个权重变量。

library(dplyr)

mtcars %>%
  mutate(am = factor(am, labels = c('automatic','manual'))) %>%
  add_count(am) %>%
  mutate(weight = (n()/2)/n)
#>     mpg cyl  disp  hp drat    wt  qsec vs        am gear carb  n    weight
#> 1  21.0   6 160.0 110 3.90 2.620 16.46  0    manual    4    4 13 1.2307692
#> 2  21.0   6 160.0 110 3.90 2.875 17.02  0    manual    4    4 13 1.2307692
#> 3  22.8   4 108.0  93 3.85 2.320 18.61  1    manual    4    1 13 1.2307692
#> 4  21.4   6 258.0 110 3.08 3.215 19.44  1 automatic    3    1 19 0.8421053
#> 5  18.7   8 360.0 175 3.15 3.440 17.02  0 automatic    3    2 19 0.8421053
#> 6  18.1   6 225.0 105 2.76 3.460 20.22  1 automatic    3    1 19 0.8421053
#> 7  14.3   8 360.0 245 3.21 3.570 15.84  0 automatic    3    4 19 0.8421053
#> 8  24.4   4 146.7  62 3.69 3.190 20.00  1 automatic    4    2 19 0.8421053
#> 9  22.8   4 140.8  95 3.92 3.150 22.90  1 automatic    4    2 19 0.8421053
#> 10 19.2   6 167.6 123 3.92 3.440 18.30  1 automatic    4    4 19 0.8421053
#> 11 17.8   6 167.6 123 3.92 3.440 18.90  1 automatic    4    4 19 0.8421053
#> 12 16.4   8 275.8 180 3.07 4.070 17.40  0 automatic    3    3 19 0.8421053
#> 13 17.3   8 275.8 180 3.07 3.730 17.60  0 automatic    3    3 19 0.8421053
#> 14 15.2   8 275.8 180 3.07 3.780 18.00  0 automatic    3    3 19 0.8421053
#> 15 10.4   8 472.0 205 2.93 5.250 17.98  0 automatic    3    4 19 0.8421053
#> 16 10.4   8 460.0 215 3.00 5.424 17.82  0 automatic    3    4 19 0.8421053
#> 17 14.7   8 440.0 230 3.23 5.345 17.42  0 automatic    3    4 19 0.8421053
#> 18 32.4   4  78.7  66 4.08 2.200 19.47  1    manual    4    1 13 1.2307692
#> 19 30.4   4  75.7  52 4.93 1.615 18.52  1    manual    4    2 13 1.2307692
#> 20 33.9   4  71.1  65 4.22 1.835 19.90  1    manual    4    1 13 1.2307692
#> 21 21.5   4 120.1  97 3.70 2.465 20.01  1 automatic    3    1 19 0.8421053
#> 22 15.5   8 318.0 150 2.76 3.520 16.87  0 automatic    3    2 19 0.8421053
#> 23 15.2   8 304.0 150 3.15 3.435 17.30  0 automatic    3    2 19 0.8421053
#> 24 13.3   8 350.0 245 3.73 3.840 15.41  0 automatic    3    4 19 0.8421053
#> 25 19.2   8 400.0 175 3.08 3.845 17.05  0 automatic    3    2 19 0.8421053
#> 26 27.3   4  79.0  66 4.08 1.935 18.90  1    manual    4    1 13 1.2307692
#> 27 26.0   4 120.3  91 4.43 2.140 16.70  0    manual    5    2 13 1.2307692
#> 28 30.4   4  95.1 113 3.77 1.513 16.90  1    manual    5    2 13 1.2307692
#> 29 15.8   8 351.0 264 4.22 3.170 14.50  0    manual    5    4 13 1.2307692
#> 30 19.7   6 145.0 175 3.62 2.770 15.50  0    manual    5    6 13 1.2307692
#> 31 15.0   8 301.0 335 3.54 3.570 14.60  0    manual    5    8 13 1.2307692
#> 32 21.4   4 121.0 109 4.11 2.780 18.60  1    manual    4    2 13 1.2307692

创建于 2023-03-29 与 reprex v2.0.2


1
投票

通常,您的样本比例超过或低于预期的总体比例。所以你想对样本比例进行加权,使它们与总体比例一致。您可以通过将前者除以后者来获得权重。

让我们通过

mtcars
中提供的化油器数量来证明这一点。假设已知/预期比例是:

carb_pop <- c(.25, .28, .1, .28, .05, .04) |> setNames(c(1:4, 6, 8))
carb_pop
#    1    2    3    4    6    8 
# 0.25 0.28 0.10 0.28 0.05 0.04 

然而,在样本中我们有:

carb_smp <- table(mtcars$carb)
proportions(table(carb_smp))
#       1       2       3       4       6       8 
# 0.21875 0.31250 0.09375 0.31250 0.03125 0.03125 

现在我们可以创建一个具有权重的命名向量

w

w <- carb_pop/proportions(carb_smp)
w
#        1        2        3        4        6        8 
# 1.142857 0.896000 1.066667 0.896000 1.600000 1.280000 

使比例一致,

all(carb_pop == w*proportions(carb_smp))
# [1] TRUE

我们现在可以使用命名向量以

match
方法创建权重,类似于您在链接问题中看到的方法。

mtcars$weights <- w[match(mtcars$carb, names(w))]

给予

head(mtcars)
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb  weights
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 0.896000
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 0.896000
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 1.142857
# Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 1.142857
# Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 0.896000
# Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 1.142857
© www.soinside.com 2019 - 2024. All rights reserved.