2013-02-19 20 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秒。如果是這樣,[this](https://stat.ethz.ch/pipermail/r-help/2007-December/147750.html)可能是一個很好的開始。 – 2013-02-19 04:32:42

+0

請將'dput(head(')的輸出複製並粘貼到你的問題中作爲編輯。如果我理解你的話,那麼'cut'和'aggregate'功能將會有用 – 2013-02-19 04:36:03

+0

是的我想插入細菌數量在每隔30秒的時間間隔... – Blake43 2013-02-19 04:48:23

回答

3

我做了一些建模。我做了一些假設。我仿效這個系統,好像你從126個細菌開始,每個細菌都有可能變成「活躍」。在試驗結束時,所有細菌都「活躍」。另外

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

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_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 2013-02-19 11:44:31

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 

需要說明的是,該系統將只檢測與一個相對頻繁的重採樣發生工作。巨大的差距會導致結果出來,你會更好地使用更復雜的解決方案。