2013-02-19 3 views
0

У меня есть этот образец данныхРазделительные данные в бункерах и вычисляя средние

Time(s) Bacteria count 
0.4 2 
0.82 5 
6.67 8 
7.55 11 
8.21 14 
8.89 17 
9.4 20 
10.18 23 
10.85 26 
11.35 29 
11.85 32 
12.41 35 
13.36 38 
13.86 41 
14.57 44 
15.08 47 
15.67 50 
16.09 53 
16.59 56 
18.53 59 
24.43 62 
25.32 65 
25.97 68 
26.37 71 
26.93 74 
27.87 77 
28.33 80 
29.1 83 
29.88 84 
30.88 85 
31.99 86 
35.65 87 
36.06 88 
36.46 89 
36.96 90 
37.39 91 
37.95 92 
38.56 93 
39.22 94 
39.79 95 
40.56 96 
41.47 97 
42.02 98 
42.73 99 
43.4 100 
43.93 101 
44.67 102 
45.24 103 
45.9 104 
46.58 105 
47.22 106 
47.89 107 
48.64 108 
49.13 109 
49.91 110 
50.48 111 
51.25 112 
53.35 113 
53.98 114 
54.69 115 
55.82 116 
56.38 117 
56.99 118 
62.09 119 
63.1 120 
63.84 121 
64.64 122 
65.37 123 
66.61 124 
69 125 
69.72 126 
70.78 126 
73.32 126 
74.65 126 
75.12 126 
75.45 126 
75.94 126 
76.38 126 
76.84 126 
77.95 126 
78.61 126 
79.06 126 
79.62 126 
80.19 126 
82.73 126 
85.3 126 
85.68 126 
86.42 126 
87.41 126 
88.08 126 
91.74 126 
92.81 126 
93.21 126 
94.32 126 
96.32 126 
102.03 126 
102.71 126 
104.45 126 
105.04 126 
105.65 126 
106.16 126 
107.44 126 
107.9 126 
109.72 126 
110.24 126 
111.24 126 
111.84 126 
112.45 126 
113.12 126 
114.02 126 
114.67 126 
115.24 126 
115.85 126 
117 126 
121.26 126 
121.8 126 
125.8 126 
127.26 126 
128.37 126 
129.48 126 
130.27 126 
131.04 126 
131.72 126 
132.47 126 
133.21 126 
134.27 126 
134.87 126 
136.04 126 
136.6 126 
137.27 126 
140.83 126 
142.05 126 
143.63 126 
144.12 126 
149.83 126 
151.07 126 
151.79 126 
153.24 126 
154.14 126 
155.24 126 
156.58 126 
157.51 126 
158.25 126 
161.43 126 
162.14 126 
162.8 126 
164.26 126 
165.09 126 
165.76 126 
166.83 126 
167.42 126 
168.94 126 
169.75 126 
170.52 126 
171.19 126 
172.67 126 
173.44 126 

Так у меня есть эти данные от времени (0 сек) до времени (2000 лет) и эту программу мы используем подсчитает количество бактерий в блюде, когда он умножается, или если нет ... он ничего не распечатывает, поэтому в основном пропускает время, когда он ничего не обнаружил. Поэтому я действительно хочу использовать R для разделения данных с интервалом в 30 секунд. Я хочу, чтобы R подсчитывало среднее количество споров бактерий каждые 30 секунд. Как мне это сделать?

+0

Этот вопрос кажется немного широким для меня. Я не думаю, что здесь используется «средний», поскольку у вас действительно есть только один набор данных. Похоже, вы хотите, чтобы интерполировать количество бактерий на каждые 30 секунд. Так на 0, 30 60 секунд. Если это так, [это] (https://stat.ethz.ch/pipermail/r-help/2007-December/147750.html) может быть хорошим местом для начала. –

+0

Скопируйте + вставьте выходные данные из 'dput (head (' в вашем кадре данных в ваш вопрос как редактирование.Если я правильно понял, функции 'cut' и' aggregate' будут полезны. –

+0

Да, я хочу интерполировать что количество бактерий составляет каждые 30 секунд ... – Blake43

ответ

3

Я сделал немного моделирования. Я сделал некоторые предположения. Я смоделировал эту систему, как будто вы начинаете с 126 бактерий, и каждый из них имеет вероятность стать «активным». В конце испытания все бактерии являются «активными». Я назвал свои данные bacteria

bacteria.glm <- glm(cbind(Bacteria_count, 126 - Bacteria_count) ~ Time, 
        data=bacteria, family=binomial(logit)) 

plot(Bacteria_count/126 ~ Time, data=bacteria) 
lines(bacteria$Time, bacteria.glm$fitted, col="red") 

enter image description here

Учитывая это, мы можем интерполировать 30-секундными интервалами:

bacteria_intervals <- seq(0, 173.44, 30) 
bac_predict<-data.frame(Time=bacteria_intervals, 
         Bacteria_count=predict(bacteria.glm, data.frame(Time=bacteria_intervals), 
               type="response")*126) 

plot(bacteria) 
points(Bacteria_count~Time, data=bac_predict, col="red", pch=16) 

enter image description here

bac_predict 
## Time Bacteria_count 
## 1 0  12.39587 
## 2 30  76.11856 
## 3 60  120.36021 
## 4 90  125.57925 
## 5 120  125.96982 
## 6 150  125.99784 

В качестве альтернативы, для линейной интерполяции :

bacteria_linear <- approx(bacteria, xout=seq(0, 173.44, 30)) 
setNames(as.data.frame(bacteria_linear), c("Time", "Bacteria_count")) 
## Time Bacteria_count 
## 1 0    NA 
## 2 30  84.1200 
## 3 60  118.5902 
## 4 90  126.0000 
## 5 120  126.0000 
## 6 150  126.0000 

Или даже сплайн интерполяция:

bacteria_spline <- spline(bacteria, xout=seq(0, 173.44, 30)) 
setNames(as.data.frame(bacteria_spline), c("Time", "Bacteria_count")) 
## Time Bacteria_count 
## 1 0  -1.672644 
## 2 30  84.110483 
## 3 60  118.854542 
## 4 90  126.000000 
## 5 120  126.000000 
## 6 150  126.000000 
+0

+1 для того, чтобы идти в длину - я действительно удивлен, что мое наивное решение не слишком сильно по сравнению с этим. – thelatemail

0

Полностью наивное моделирование просто усреднение последнего значения в 30 втором блоке, и первое значение следующего 30 второго блока:

Получить данные:

test <- read.table(text="time bacteria 
0.4 2 
0.82 5 
6.67 8 
7.55 11 
8.21 14 
8.89 17 
9.4 20 
10.18 23 
10.85 26 
11.35 29 
11.85 32 
12.41 35 
13.36 38 
13.86 41 
14.57 44 
15.08 47 
15.67 50 
16.09 53 
16.59 56 
18.53 59 
24.43 62 
25.32 65 
25.97 68 
26.37 71 
26.93 74 
27.87 77 
28.33 80 
29.1 83 
29.88 84 
30.88 85 
31.99 86 
35.65 87 
36.06 88 
36.46 89 
36.96 90 
37.39 91 
37.95 92 
38.56 93 
39.22 94 
39.79 95 
40.56 96 
41.47 97 
42.02 98 
42.73 99 
43.4 100 
43.93 101 
44.67 102 
45.24 103 
45.9 104 
46.58 105 
47.22 106 
47.89 107 
48.64 108 
49.13 109 
49.91 110 
50.48 111 
51.25 112 
53.35 113 
53.98 114 
54.69 115 
55.82 116 
56.38 117 
56.99 118 
62.09 119 
63.1 120 
63.84 121 
64.64 122 
65.37 123 
66.61 124 
69 125 
69.72 126 
70.78 126 
73.32 126 
74.65 126 
75.12 126 
75.45 126 
75.94 126 
76.38 126 
76.84 126 
77.95 126 
78.61 126 
79.06 126 
79.62 126 
80.19 126 
82.73 126 
85.3 126 
85.68 126 
86.42 126 
87.41 126 
88.08 126 
91.74 126 
92.81 126 
93.21 126 
94.32 126 
96.32 126 
102.03 126 
102.71 126 
104.45 126 
105.04 126 
105.65 126 
106.16 126 
107.44 126 
107.9 126 
109.72 126 
110.24 126 
111.24 126 
111.84 126 
112.45 126 
113.12 126 
114.02 126 
114.67 126 
115.24 126 
115.85 126 
117 126 
121.26 126 
121.8 126 
125.8 126 
127.26 126 
128.37 126 
129.48 126 
130.27 126 
131.04 126 
131.72 126 
132.47 126 
133.21 126 
134.27 126 
134.87 126 
136.04 126 
136.6 126 
137.27 126 
140.83 126 
142.05 126 
143.63 126 
144.12 126 
149.83 126 
151.07 126 
151.79 126 
153.24 126 
154.14 126 
155.24 126 
156.58 126 
157.51 126 
158.25 126 
161.43 126 
162.14 126 
162.8 126 
164.26 126 
165.09 126 
165.76 126 
166.83 126 
167.42 126 
168.94 126 
169.75 126 
170.52 126 
171.19 126 
172.67 126 
173.44 126",header=TRUE) 

Найти блоки и взять средние:

test$block <- findInterval(test$time,seq(0,max(test$time),30)) 

apply(
    rbind(
    tapply(test$bacteria,test$block,max), 
    c(tail(tapply(test$bacteria,test$block,min),-1),NA) 
), 
    2, 
    mean, 
    na.rm=TRUE 
) 

Результат:

1  2  3  4  5  6 
84.5 118.5 126.0 126.0 126.0 126.0 

Протест будет то, что эта система будет работать только с тестированием, что происходит с относительно частой повторной выборки. Большие пробелы бросят результат, и вам будет лучше с более сложным решением.