给出的数据是从24名住院的美国标准饮食人群和同意接受1个月的素食饮食的胆固醇水平中抽取的样本。血清胆固醇的测定是在饮食前和饮食后的1个月进行的。
Subject Before After Difference
1 1 195 146 49
2 2 145 155 -10
3 3 205 178 27
4 4 159 146 13
5 5 244 208 36
6 6 166 147 19
7 7 250 202 48
8 8 236 215 21
9 9 192 184 8
10 10 224 208 16
11 11 238 206 32
12 12 197 169 28
13 13 169 182 -13
14 14 158 127 31
15 15 151 149 2
16 16 197 178 19
17 17 180 161 19
18 18 222 187 35
19 19 168 176 -8
20 20 168 145 23
21 21 167 154 13
22 22 161 153 8
23 23 178 137 41
24 24 137 125 12
现在这是我要回答的问题。一些研究人员相信饮食的影响
胆固醇水平高而不是低水平的人们更容易发现胆固醇。如果您根据中位胆固醇的基线以上或以下来拆分数据,您是否可以描述性地评论此问题?
现在,我正在考虑根据此处的两个类别创建箱线图。我希望在这里使用dplyr
进行数据操作。因此,我将基于Before
小于或大于Before
的中位数来创建新列。因此,我将有一个新的字符向量,其中“高”表示胆固醇前高,而“低”表示胆固醇前低。然后,我将基于新的分类列对Difference
进行箱线图绘制。所以,这是我的代码。我将原始数据集称为df2
。
df2 %>%
mutate(new_col = if_else(Before < median(Before), "low", "high")) %>%
group_by(new_col) %>%
ggplot(aes(x= new_col, y=Difference)) +
geom_boxplot()
因此,基于此,我得出结论,研究者的观点是正确的,饮食对胆固醇的影响在高胆固醇水平而非低胆固醇水平的人群中更为明显。我想知道这是否可以更有效地完成。
答案 0 :(得分:1)
并不是真正的答案,而是更多的数据可视化方法。
library( data.table )
library( ggplot2 )
DT.melt <- melt( DT, id.vars = "Subject", measure.vars = c( "Before", "After" ) )
ggplot() +
geom_line( data = DT.melt,
aes( x = variable, y = value, group = Subject ) ) +
geom_line( data = DT.melt[, .(mean = mean(value)), by = variable ],
aes( x = variable, y = mean, group = 1 ), color = "red", size = 2 ) +
labs( x = "", y = "" )
使用的样本数据
DT <- fread(" Subject Before After Difference
1 195 146 49
2 145 155 -10
3 205 178 27
4 159 146 13
5 244 208 36
6 166 147 19
7 250 202 48
8 236 215 21
9 192 184 8
10 224 208 16
11 238 206 32
12 197 169 28
13 169 182 -13
14 158 127 31
15 151 149 2
16 197 178 19
17 180 161 19
18 222 187 35
19 168 176 -8
20 168 145 23
21 167 154 13
22 161 153 8
23 178 137 41
24 137 125 12")
答案 1 :(得分:1)
这更是一个统计计划问题,而不是编程问题,因此,它比起StackOverflow更属于stats.stackexchange。
无论如何,不建议根据中位数对变量进行分类,这是不建议使用的可视化关联方式,因为您要隐藏大量信息。您可以在Peter Flom的this very good article中阅读有关内容。
最好保留所有点并应用一些样条或平滑算法。
例如,您可以考虑以下内容:
ggplot(df2, aes(x= Before, y=Difference)) +
geom_point() +
geom_smooth()
在这里,这种关系清晰可见,同时保留了您想要的所有信息。
如果您确实需要生成子组,也可以尝试执行以下操作:
df2 %>%
mutate(new_col = if_else(Before < median(Before), "low", "high")) %>%
ggplot(aes(x= Before, y=Difference, group=new_col, color=new_col)) +
geom_point() +
geom_smooth(span=3) #try some other values here
但是,使用中位数仍然不是一个好主意,尤其是在具有大量数据点的情况下。您可能需要评估关系的功能形式,但这需要在stats.stackexchange.com上有一个特定的问题。