заполнение недостающих данных с использованием установленного значения в R - PullRequest
0 голосов
/ 23 октября 2019

У меня есть такой фрейм данных:

    ID  year    age wage
1   2   1981    22  10000
2   2   1982    23  11000
3   2   1983    24  11500
4   2   1984    25  11000
5   2   1985    26  14000
6   2   1986    27  16000
7   2   1987    28  20000
8   2   1988    29  19000
9   2   1989    30  20000
10  2   1990    31  20000
11  2   1991    32  22000
12  2   1992    33  25000
13  2   1993    34  0
14  2   1994    35  NA
15  2   1995    36  0
16  2   1996    37  NA
17  2   1997    38  0
18  2   1998    39  NA
19  2   1999    40  0
20  2   2000    41  NA
21  2   2001    42  0
22  2   2002    43  NA
23  2   2003    44  0
24  2   2004    45  NA
25  2   2005    46  5500
26  2   2006    47  NA
27  2   2007    48  5000
28  2   2008    49  NA
29  2   2009    50  6000
30  2   2010    51  NA
31  2   2011    52  19000
32  2   2012    53  NA
33  2   2013    54  21000
34  2   2014    55  NA
35  2   2015    56  23000
36  3   1984    22  1300
37  3   1985    23  0
38  3   1986    24  1500
39  3   1987    25  1000
40  3   1988    26  0

Я хочу использовать индивидуальную регрессию заработной платы по возрасту и квадрату возраста для вменения наблюдений за отсутствующими заработными платами. Я хочу вменять только тогда, когда доступны по крайней мере 5 не пропущенных наблюдений.

Как и предполагал jay.sf, я попробовал следующее, но со встроенными значениями:

df_imp <- do.call(rbind, 
                  by(df, df$ID, function(x) {
                    IDs <- which(is.na(x$wage))
                    if (length(x$wage[- IDs]) >= 5) {
                      b <- lm(wage ~ poly(age, 2, raw=TRUE), x)$fitted.values
                      x$wage[IDs] <- with(x, b)[IDs]
                    }
                    return(x)
                  }))


Я получилследующие результаты:

        ID  year    age wage
36  2   1981    22  10000.000
37  2   1982    23  11000.000
38  2   1983    24  11500.000
39  2   1984    25  11000.000
40  2   1985    26  14000.000
41  2   1986    27  16000.000
42  2   1987    28  20000.000
43  2   1988    29  19000.000
44  2   1989    30  20000.000
45  2   1990    31  20000.000
46  2   1991    32  22000.000
47  2   1992    33  25000.000
48  2   1993    34  0.000
49  2   1994    35  7291.777
50  2   1995    36  0.000
51  2   1996    37  6779.133
52  2   1997    38  0.000
53  2   1998    39  7591.597
54  2   1999    40  0.000
55  2   2000    41  9729.168
56  2   2001    42  0.000
57  2   2002    43  13191.847
58  2   2003    44  0.000
59  2   2004    45  17979.633
60  2   2005    46  5500.000
61  2   2006    47  NA
62  2   2007    48  5000.000
63  2   2008    49  NA
64  2   2009    50  6000.000
65  2   2010    51  NA
66  2   2011    52  19000.000
67  2   2012    53  NA
68  2   2013    54  21000.000
69  2   2014    55  NA
70  2   2015    56  23000.000

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете использовать простое выражение if без else. Определите вектор идентификатора IDs, который идентифицирует пропуски, который вы используете для их подсчета и для поднабора вашего столбца Y wage.

. Для этого вы можете использовать by(), который разбивает ваши данные подобно split() но вы можете применить функцию;просто rbind результат.

Вероятно, разумнее использовать коэффициенты, чем соответствующие значения, потому что последние также будут NA, если ваш Y равен NA. И вам нужно использовать raw=TRUE в poly.

DF.imp <- do.call(rbind, 
              by(DF, DF$ID, function(x) {
                IDs <- which(is.na(x$wage))
                if (length(x$wage[- IDs]) >= 5) {
                  b <- lm(wage ~ poly(age, 2, raw=TRUE), x)$coefficients
                  x$wage[IDs] <- with(x, (b[1] + b[2]*age + b[3]*age^2))[IDs]
                }
                return(x)
              }))

Обратите внимание, что я немного изменил данные вашего примера, так что в ID 3 также есть пропуски, но меньше 5 пропусков.

Результат

DF.imp
#      ID year age      wage
# 2.1   2 1981  22 10000.000
# 2.2   2 1982  23 11000.000
# 2.3   2 1983  24 11500.000
# 2.4   2 1984  25 11000.000
# 2.5   2 1985  26 14000.000
# 2.6   2 1986  27 16000.000
# 2.7   2 1987  28 20000.000
# 2.8   2 1988  29 19000.000
# 2.9   2 1989  30 20000.000
# 2.10  2 1990  31 20000.000
# 2.11  2 1991  32 22000.000
# 2.12  2 1992  33 25000.000
# 2.13  2 1993  34     0.000
# 2.14  2 1994  35  7626.986
# 2.15  2 1995  36     0.000
# 2.16  2 1996  37  7039.387
# 2.17  2 1997  38     0.000
# 2.18  2 1998  39  6783.065
# 2.19  2 1999  40     0.000
# 2.20  2 2000  41  6858.020
# 2.21  2 2001  42     0.000
# 2.22  2 2002  43  7264.252
# 2.23  2 2003  44     0.000
# 2.24  2 2004  45  8001.761
# 2.25  2 2005  46  5500.000
# 2.26  2 2006  47  9070.546
# 2.27  2 2007  48  5000.000
# 2.28  2 2008  49 10470.609
# 2.29  2 2009  50  6000.000
# 2.30  2 2010  51 12201.948
# 2.31  2 2011  52 19000.000
# 2.32  2 2012  53 14264.565
# 2.33  2 2013  54 21000.000
# 2.34  2 2014  55 16658.458
# 2.35  2 2015  56 23000.000
# 3.36  3 1984  22  1300.000
# 3.37  3 1985  23        NA
# 3.38  3 1986  24  1500.000
# 3.39  3 1987  25  1000.000
# 3.40  3 1988  26        NA

данные

DF <- structure(list(ID = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), year = c(1981L, 
1982L, 1983L, 1984L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L, 
1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L, 1998L, 1999L, 
2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 
2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 1984L, 1985L, 
1986L, 1987L, 1988L), age = c(22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 
55L, 56L, 22L, 23L, 24L, 25L, 26L), wage = c(10000L, 11000L, 
11500L, 11000L, 14000L, 16000L, 20000L, 19000L, 20000L, 20000L, 
22000L, 25000L, 0L, NA, 0L, NA, 0L, NA, 0L, NA, 0L, NA, 0L, NA, 
5500L, NA, 5000L, NA, 6000L, NA, 19000L, NA, 21000L, NA, 23000L, 
1300L, NA, 1500L, 1000L, NA)), row.names = c(NA, -40L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...