簡體   English   中英

在R中重新采樣縱向數據集

[英]Resample a longitudinal dataset in R

我有一個縱向數據集,其中包含針對所有個人的每個觀察結果的一行。 每個觀察值有多個測量值,有些可能會丟失。 個人的觀察值變化很大,而且輟學率很高。 這是數據集的一部分

> head(mydata,33)
       id obstime agebase      cd4      rna  hem
1   10056       1      59 25.17936 3.611298 15.0
3   10056       3      59 21.33073 4.044030 15.4
4   10082       1      35 23.64318 5.275298 14.9
12  10082       9      35 22.31591 5.493349 14.4
22  10082      19      35       NA 5.875061 13.8
26  10082      23      35 18.84144 5.462503 13.9
28  10082      25      35 23.36664 2.397940 13.7
31  10082      28      35 26.55184       NA 15.3
34  10082      31      35 24.91987       NA 14.8
37  10082      34      35 24.08319       NA 15.5
41  10082      38      35 24.49490       NA 15.2
44  10082      41      35 26.00000       NA 15.5
48  10082      45      35 26.79552       NA 15.6
51  10082      48      35 24.53569       NA 14.9
55  10082      52      35 27.25803       NA 16.2
58  10082      55      35 26.47640       NA 15.4
61  10082      58      35 30.31501       NA 15.6
64  10082      61      35 27.01851       NA 15.8
67  10082      64      35 27.00000       NA   NA
70  10082      67      35 28.37252       NA 16.2
73  10082      70      35 27.20294       NA 14.9
77  10082      74      35 25.23886       NA 14.7
79  10082      76      35 28.65310       NA 15.8
82  10082      79      35 28.17801       NA   NA
85  10082      82      35 29.52965       NA 15.5
88  10082      85      35 29.52965 2.397940 15.5
89  10143       1      46 20.97618 4.361728 13.2
94  10143       6      46 22.00000 4.173507 14.0
98  10143      10      46 22.00000 4.173507 14.0
99  10215       1      33 20.49390 4.144605 16.0
......
> dim(mydata)
[1] 19793     6
> length(unique(mydata$id))
[1] 2161

我需要從該數據集中生成引導樣本,並在其中保留各個簇,這樣,如果對一個個體進行了采樣,則該id的整個觀察值將進入引導樣本。 當然,可以對一個人進行一次以上的采樣,在這種情況下,它應該將重新采樣的數據輸入適當的次數,並且理想情況下會收到一個更改的ID號,例如10056.1、10056.2。

現在,我將盡我所能來解決問題,但是如果有人對如何快速完成此事有任何想法,我將不勝感激。

編輯:我最終使用了什么

dat <- mydata
indiv <- unique(dat[, 1])
smp <- sort(sample(indiv, length(indiv), replace=TRUE))
smp.df <- data.frame(id=smp)
dat.b = merge(smp.df, dat, all.x=TRUE)    
# Number of observations for all IDs in original dataset
n.obs <- table(dat[, 1])
# Unique ids in the bootstrap sample
smpU <- unique(smp)
# Number of replicates sampled
reps <- as.vector(table(smp))
# Number of observations in the sampled IDs observation sets
obs <- as.vector(n.obs[match(smpU, names(n.obs))])

# Hacking the names
id.rep.obs <- cbind(smpU, reps, obs)   
NameFun <- function(info) {
  names <- as.numeric(paste0(rep(info[1], info[2]), ".", seq(1, info[2])))
  names.long <- sort(rep(names, info[3]))
}
dat.b[, 1] <- do.call("c", apply(id.rep.obs, 1, NameFun))
dat.b <- dat.b[order(dat.b[, 1], dat.b[, 2]), ]

您可以使用sample創建一個id列表,然后是merge()

首先,重新創建數據:

dat <- read.table(text="
       id obstime agebase      cd4      rna  hem
1   10056       1      59 25.17936 3.611298 15.0
3   10056       3      59 21.33073 4.044030 15.4
4   10082       1      35 23.64318 5.275298 14.9
12  10082       9      35 22.31591 5.493349 14.4
22  10082      19      35       NA 5.875061 13.8
26  10082      23      35 18.84144 5.462503 13.9
28  10082      25      35 23.36664 2.397940 13.7
31  10082      28      35 26.55184       NA 15.3
34  10082      31      35 24.91987       NA 14.8
37  10082      34      35 24.08319       NA 15.5
41  10082      38      35 24.49490       NA 15.2
44  10082      41      35 26.00000       NA 15.5
48  10082      45      35 26.79552       NA 15.6
51  10082      48      35 24.53569       NA 14.9
55  10082      52      35 27.25803       NA 16.2
58  10082      55      35 26.47640       NA 15.4
61  10082      58      35 30.31501       NA 15.6
64  10082      61      35 27.01851       NA 15.8
67  10082      64      35 27.00000       NA   NA
70  10082      67      35 28.37252       NA 16.2
73  10082      70      35 27.20294       NA 14.9
77  10082      74      35 25.23886       NA 14.7
79  10082      76      35 28.65310       NA 15.8
82  10082      79      35 28.17801       NA   NA
85  10082      82      35 29.52965       NA 15.5
88  10082      85      35 29.52965 2.397940 15.5
89  10143       1      46 20.97618 4.361728 13.2
94  10143       6      46 22.00000 4.173507 14.0
98  10143      10      46 22.00000 4.173507 14.0
99  10215       1      33 20.49390 4.144605 16.0", header=TRUE)

現在創建一個ID號示例:

set.seed(42)
indiv <- unique(dat$id)
smp <- data.frame(id=sample(indiv, 10, replace=TRUE))
smp

      id
1  10082
2  10143
3  10215
4  10082
5  10082
6  10215
7  10215
8  10056
9  10082
10 10143

最后,合並:

merge(smp, dat, all.x=TRUE)

您會注意到,對於每個id集,您的示例都帶有多個觀察值:

       id obstime agebase      cd4      rna  hem
1   10056       1      59 25.17936 3.611298 15.0
2   10056       3      59 21.33073 4.044030 15.4
3   10082      19      35       NA 5.875061 13.8
4   10082      23      35 18.84144 5.462503 13.9
5   10082       1      35 23.64318 5.275298 14.9
6   10082       9      35 22.31591 5.493349 14.4
7   10082      31      35 24.91987       NA 14.8
8   10082      34      35 24.08319       NA 15.5
9   10082      25      35 23.36664 2.397940 13.7
10  10082      28      35 26.55184       NA 15.3
11  10082      45      35 26.79552       NA 15.6
12  10082      48      35 24.53569       NA 14.9
13  10082      38      35 24.49490       NA 15.2
14  10082      41      35 26.00000       NA 15.5
15  10082      58      35 30.31501       NA 15.6
16  10082      61      35 27.01851       NA 15.8
17  10082      52      35 27.25803       NA 16.2
18  10082      55      35 26.47640       NA 15.4
19  10082      70      35 27.20294       NA 14.9
20  10082      74      35 25.23886       NA 14.7
21  10082      64      35 27.00000       NA   NA
22  10082      67      35 28.37252       NA 16.2
23  10082      82      35 29.52965       NA 15.5
24  10082      85      35 29.52965 2.397940 15.5
25  10082      76      35 28.65310       NA 15.8
26  10082      79      35 28.17801       NA   NA
27  10082      19      35       NA 5.875061 13.8
28  10082      23      35 18.84144 5.462503 13.9
29  10082       1      35 23.64318 5.275298 14.9
30  10082       9      35 22.31591 5.493349 14.4
31  10082      31      35 24.91987       NA 14.8
32  10082      34      35 24.08319       NA 15.5
33  10082      25      35 23.36664 2.397940 13.7
34  10082      28      35 26.55184       NA 15.3
35  10082      45      35 26.79552       NA 15.6
36  10082      48      35 24.53569       NA 14.9
37  10082      38      35 24.49490       NA 15.2
38  10082      41      35 26.00000       NA 15.5
39  10082      58      35 30.31501       NA 15.6
40  10082      61      35 27.01851       NA 15.8
41  10082      52      35 27.25803       NA 16.2
42  10082      55      35 26.47640       NA 15.4
43  10082      70      35 27.20294       NA 14.9
44  10082      74      35 25.23886       NA 14.7
45  10082      64      35 27.00000       NA   NA
46  10082      67      35 28.37252       NA 16.2
47  10082      82      35 29.52965       NA 15.5
48  10082      85      35 29.52965 2.397940 15.5
49  10082      76      35 28.65310       NA 15.8
50  10082      79      35 28.17801       NA   NA
51  10082      19      35       NA 5.875061 13.8
52  10082      23      35 18.84144 5.462503 13.9
53  10082       1      35 23.64318 5.275298 14.9
54  10082       9      35 22.31591 5.493349 14.4
55  10082      31      35 24.91987       NA 14.8
56  10082      34      35 24.08319       NA 15.5
57  10082      25      35 23.36664 2.397940 13.7
58  10082      28      35 26.55184       NA 15.3
59  10082      45      35 26.79552       NA 15.6
60  10082      48      35 24.53569       NA 14.9
61  10082      38      35 24.49490       NA 15.2
62  10082      41      35 26.00000       NA 15.5
63  10082      58      35 30.31501       NA 15.6
64  10082      61      35 27.01851       NA 15.8
65  10082      52      35 27.25803       NA 16.2
66  10082      55      35 26.47640       NA 15.4
67  10082      70      35 27.20294       NA 14.9
68  10082      74      35 25.23886       NA 14.7
69  10082      64      35 27.00000       NA   NA
70  10082      67      35 28.37252       NA 16.2
71  10082      82      35 29.52965       NA 15.5
72  10082      85      35 29.52965 2.397940 15.5
73  10082      76      35 28.65310       NA 15.8
74  10082      79      35 28.17801       NA   NA
75  10082      19      35       NA 5.875061 13.8
76  10082      23      35 18.84144 5.462503 13.9
77  10082       1      35 23.64318 5.275298 14.9
78  10082       9      35 22.31591 5.493349 14.4
79  10082      31      35 24.91987       NA 14.8
80  10082      34      35 24.08319       NA 15.5
81  10082      25      35 23.36664 2.397940 13.7
82  10082      28      35 26.55184       NA 15.3
83  10082      45      35 26.79552       NA 15.6
84  10082      48      35 24.53569       NA 14.9
85  10082      38      35 24.49490       NA 15.2
86  10082      41      35 26.00000       NA 15.5
87  10082      58      35 30.31501       NA 15.6
88  10082      61      35 27.01851       NA 15.8
89  10082      52      35 27.25803       NA 16.2
90  10082      55      35 26.47640       NA 15.4
91  10082      70      35 27.20294       NA 14.9
92  10082      74      35 25.23886       NA 14.7
93  10082      64      35 27.00000       NA   NA
94  10082      67      35 28.37252       NA 16.2
95  10082      82      35 29.52965       NA 15.5
96  10082      85      35 29.52965 2.397940 15.5
97  10082      76      35 28.65310       NA 15.8
98  10082      79      35 28.17801       NA   NA
99  10143      10      46 22.00000 4.173507 14.0
100 10143       1      46 20.97618 4.361728 13.2
101 10143       6      46 22.00000 4.173507 14.0
102 10143      10      46 22.00000 4.173507 14.0
103 10143       1      46 20.97618 4.361728 13.2
104 10143       6      46 22.00000 4.173507 14.0
105 10215       1      33 20.49390 4.144605 16.0
106 10215       1      33 20.49390 4.144605 16.0
107 10215       1      33 20.49390 4.144605 16.0

我知道這是一個老問題,我有自己的解決方案。

基本思想是將數據拆分為按ID列出的列表,然后對ID進行采樣。 使用采樣的ID來匹配列表並創建新的ID:

out <- split(dat, f = dat$id)

smp.id <- sample(dat$id, length(unique(dat$id)), replace = TRUE)

samp.df <- lapply(seq_along(smp.id), function(x){
  res <- out[[as.character(smp.id[x])]] # To avoid numeric ID
  res$newID <- x
  return(res)
})

samp.df <- do.call(rbind, samp.df)

變量newID有助於區分引導樣本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM