【问题标题】:How to plot relative frequencies in R or Stata如何在 R 或 Stata 中绘制相对频率
【发布时间】:2014-04-26 21:02:32
【问题描述】:

我有这个数据集:

> head(xc)
  wheeze3 SmokingGroup_Kai TG2000 TG2012 PA_Score asthma3 tres3 age3    bmi     bmi3
1       0                1      2      2        2       0     0   47 20.861 21.88708
2       0                5      2      3        3       0     0   57 20.449 23.05175
3       0                1      2      3        2       0     0   45 25.728 26.06168
4       0                2      1      1        3       0     0   48 22.039 23.50780
5       1                4      2      2        1       0     1   61 25.391 25.63692
6       0                4      2      2        2       0     0   54 21.633 23.66144
  education3 group_change
1          2            0
2          2            3
3          3            3
4          3            0
5          1            0
6          2            0

这里 asthma3 是一个取值 0,1 的变量; group_change 取值 0,1,2,3,4,5,6 ; age3 代表年龄。

我想将拥有asthma3==1 的人的百分比绘制为变量age3 的函数。 我想要将样本除以group_change 获得的同一图上的 6 条线。

我认为使用ggplot2 应该可以做到这一点。

【问题讨论】:

  • 您是否将age3 视为连续的,如果是,跨越什么范围?您是否有足够的数据来为group_change 的每个级别执行此操作?
  • 我应该有足够的数据
  • 对于未来的问题,请显示尝试的代码。

标签: r plot ggplot2 stata


【解决方案1】:

这是一个 ggplot2 方法:

library(ggplot2)
library(dplyr)

# Create fake data
set.seed(10)
xc=data.frame(age3=sample(40:50, 500, replace=TRUE),
           asthma3=sample(0:1,500, replace=TRUE), 
           group_change=sample(0:6, 500, replace=TRUE)) 

# Summarize asthma percent by group_change and age3 (using dplyr)
xc1 = xc %.%
  group_by(group_change, age3) %.%
  summarize(asthma.pct=mean(asthma3)*100)

# Plot using ggplot2
ggplot(xc1, aes(x=age3, y=asthma.pct, colour=as.factor(group_change))) + 
  geom_line() + 
  geom_point() +
  scale_x_continuous(breaks=40:50) +
  xlab("Age") + ylab("Asthma Percent") +
  scale_colour_discrete(name="Group Change")

这是另一种 ggplot2 方法,它直接使用原始数据框并即时计算百分比。我还将 y 轴格式化为百分比格式。

library(scales) # Need this for "percent_format()"
ggplot(xc, aes(x=age3, y=asthma3, colour=as.factor(group_change))) + 
  stat_summary(fun.y=mean, geom='line') +
  stat_summary(fun.y=mean, geom='point') +
  scale_x_continuous(breaks=40:50) +
  scale_y_continuous(labels=percent_format()) +
  xlab("Age") + ylab("Asthma Percent") +
  scale_colour_discrete(name="Group Change")

【讨论】:

    【解决方案2】:

    这是使用 Stata 的一种方法。示例数据分为三组。

    比例是根据您识别为二进制变量的asthma3 的平均值计算得出的。

    clear all
    set more off
    
    *----- example data -----
    
    set obs 500
    set seed 135
    
    gen age3 = floor((50-40+1)*runiform() + 40)
    gen asthma3 = round(runiform())
    egen group_change = seq(), to(3)
    
    *----- pretty list -----
    
    order age3 group_change 
    sort age3 group_change asthma3
    list, sepby(age3)
    
    *----- compute proportions -----
    
    collapse (mean) asthma3, by(age3 group_change)
    list
    
    *----- syntax for graph and graph -----
    
    levelsof(group_change), local(gc)
    
    local i = 1
    foreach g of local gc {
        local call `call' || connected asthma3 age3 if group_change == `g', sort
        local leg `leg' label(`i++' "Group`g'") // syntax for legend
    }
    
    twoway `call' legend(`leg') /// graph
        title("Proportion with asthma by group")
    

    这与我在Statalist 中提出的第一个问题不谋而合。用尼克的话来说,您使用本地宏“构建语法”,然后将其提供给twoway

    @NickCox 在评论中提出了一个替代方案:

    <snip>
    
    *----- compute proportions -----
    
    collapse (mean) asthma3, by(age3 group_change)
    list
    
    *----- graph -----
    
    separate asthma3, by(group_change) veryshortlabel
    
    twoway connected asthma31-asthma33 age3, sort ///
        title("Proportion with asthma by group")
    
    <snip>
    

    第二种选择从原始asthma3 创建新变量,我在对twoway connected 的调用中将其缩写为asthma31-asthma33

    这两种选择都会生成一个图例来标识组。我留给你的标签(见help graph)。

    【讨论】:

    • 这运行良好,但在图例中我获得了所有具有相同名称(平均)哮喘的颜色。如何更改它以查看组号?
    • collapse 之后,您还可以使用separate asthma3, by(group_change) veryshortlabel,然后您有一组变量可以针对“age3”进行绘图。使用这种语法,不同的颜色是自动的。
    • 对不起,这对我来说不是很清楚。你能编辑stata sintax吗?我对stata很陌生。我想要一个输出,例如使用 eipi10 答案获得的输出
    • 假设 Stata 用户可以理解/执行 R 代码(反之亦然)并不是一个好主意。如果您想显示图表的外观,您可以简单地在您的帖子中引入图像(或链接)。我已经编辑了我的答案以解决图例的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多