R语言 使用数据组在ggplot2中绘制指数回归

vuktfyat  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(196)

我是一个新手编码,所以这可能很简单,但我不知道我在做什么。
我有实验动物工作的行为数据,动物被记录了5次行为试验(HT、T1、T2、T3、T4),并报告了它们接受电击的次数,我在这个数据集中有两组动物,一个实验组和一个对照组(分别为TR和UT)

cohort animalID trial num.shocks
1      TR   295727    HT        211
2      TR   295727    T1         20
3      TR   295727    T2         10
4      TR   295727    T3          4
5      TR   295727    T4          1
6      TR   295729    HT        161
7      TR   295729    T1         55
8      TR   295729    T2         56
9      TR   295729    T3         53
10     TR   295729    T4         53
11     TR   295731    HT        153
12     TR   295731    T1         19
13     TR   295731    T2          2
14     TR   295731    T3          0
15     TR   295731    T4          8
16     UT   295734    HT        197
17     UT   295734    T1        174
18     UT   295734    T2        155
19     UT   295734    T3        175
20     UT   295734    T4        155
21     UT   298736    HT        172
22     UT   298736    T1        178
23     UT   298736    T2        164
24     UT   298736    T3        133
25     UT   298736    T4        161
26     UT   298737    HT        168
27     UT   298737    T1        187
28     UT   298737    T2        119
29     UT   298737    T3        174
30     UT   298737    T4        155
31     TR   300844    HT        170
32     TR   300844    T1          4
33     TR   300844    T2          3
34     TR   300844    T3          0
35     TR   300844    T4          1
36     UT   300845    HT        167
37     UT   300845    T1        129
38     UT   300845    T2        123
39     UT   300845    T3        138
40     UT   300845    T4        127
41     UT   300846    HT        158
42     UT   300846    T1        158
43     UT   300846    T2        131
44     UT   300846    T3        125
45     UT   300846    T4        212
46     TR   300848    HT        131
47     TR   300848    T1         22
48     TR   300848    T2          3
49     TR   300848    T3          1
50     TR   300848    T4          3
51     UT   334953    HT        154
52     UT   334953    T1        203
53     UT   334953    T2        249
54     UT   334953    T3        263
55     UT   334953    T4        260
56     UT   334954    HT        229
57     UT   334954    T1        315
58     UT   334954    T2        285
59     UT   334954    T3        261
60     UT   334954    T4        209
61     TR   334955    HT        141
62     TR   334955    T1         11
63     TR   334955    T2          2
64     TR   334955    T3          1
65     TR   334955    T4          1
66     TR   334960    HT        206
67     TR   334960    T1        104
68     TR   334960    T2         86
69     TR   334960    T3         18
70     TR   334960    T4          8
71     UT   336414    HT        225
72     UT   336414    T1        155
73     UT   336414    T2        162
74     UT   336414    T3        184
75     UT   336414    T4        140
76     UT   336415    HT        223
77     UT   336415    T1        212
78     UT   336415    T2        141
79     UT   336415    T3        163
80     UT   336415    T4        151
81     TR   336416    HT        216
82     TR   336416    T1          8
83     TR   336416    T2         66
84     TR   336416    T3         39
85     TR   336416    T4         51
86     TR   336417    HT        197
87     TR   336417    T1         44
88     TR   336417    T3          9
89     TR   336417    T4          4
90     TR   339516    HT        158
91     TR   339516    T1         14
92     TR   339516    T2          2
93     TR   339516    T3          6
94     TR   339516    T4          2
95     TR   339517    HT        180
96     TR   339517    T1          9
97     TR   339517    T2          2
98     TR   339517    T3          2
99     TR   339517    T4          2

我将这些数据绘制为按队列分组的geom_points,其中trial为x轴,number.shocks为y轴
我想用指数模型拟合这些数据,以表明TR组拟合指数衰减,而UT组不拟合。
我已经尝试了许多不同的方法使用geom_smooth和不同的公式或处理我的数据,我得到了许多错误,我看到没有解决与我的不同方法。
最初我认为问题是我的x轴变量是分类的。但它可以作为一个“时间”变量,甚至当我把它作为一个数值,我仍然没有成功
这是我第一次尝试

ggplot(data = combo_behave_room[!(combo_behave_room$trial == "RT"),], 
             aes(x = trial, y = num.shocks, fill = cohort)) + 
  geom_point(aes(shape = expt.combo), color = "black", size = 3, position=position_dodge(width = .5)) + 
  stat_summary(aes(group = cohort, color = cohort), size = 1, fun = mean, geom = "line")

但这是不够的,因为我正在寻找一个回归模型,而不仅仅是一条线绘制的平均值
我希望像这样简单的东西能起作用

ggplot(data = test[!(test$trial == "RT"),], 
             aes(x = as.numeric(trial), y = num.shocks, fill = cohort)) + 
  geom_point(aes(shape = expt.combo), color = "black", size = 3, position=position_dodge(width = .5)) + 
  geom_smooth(method="lm", 
              formula=log(y) ~x)

但也不想制造情节
最后,我尝试让chatGPT提供帮助,我遇到了这个功能解决方案,但它是不够的,因为它需要我缩放y轴数据第一,这意味着我不绘制我的数据的绝对值

ggplot(data = test[!(test$trial == "RT"),], 
               aes(x = trial, y = num.shocks_scaled, fill = cohort, group = cohort)) + 
       geom_point(aes(shape = expt.combo), color = "black", size = 3, position=position_dodge(width = .5)) + 
       geom_smooth(aes(color = cohort), method="glm", method.args=list(family="quasibinomial"), formula=y ~ x)

在这些图上还有其他图层,用于对点进行着色或标记为简单起见而排除在外的轴

ut6juiuv

ut6juiuv1#

您需要一些技巧:

  • 因为x变量是无条件的,所以在规范中需要aes(group=cohort)(如果**trial已经成为一个因子,那么as.numeric(trial)也可以工作-如果trial是一个字符向量,那么as.numeric(trial)就不能工作-但是这样做更漂亮一些)
  • 使用带有日志链接的高斯GLM
  • 使用y+1作为响应,而不是y-否则零会使您陷入混乱(对数高斯GLM比转换数据更健壮,但仍需要一点帮助才能获得可行的初始值)
library(ggplot2)
theme_set(theme_bw(base_size=16))
ggplot(dd, aes(trial, num.shocks)) +
    geom_point(aes(colour = cohort)) +
    geom_smooth(method = "glm",
                aes(group=cohort, colour = cohort),
                formula = y+1 ~ x,
                method.args = list(family = gaussian(link = "log")))

虽然可以从ggplot的输出中提取回归信息,但我通常发现在ggplot之外重新运行模型是最简单的。与ggplot内部所做的最接近的模拟(即为每个队列运行单独的模型,试验作为数字变量)是:

dd$num_trial <- as.numeric(factor(dd$trial))
lme4::lmList((num.shocks + 1) ~ num_trial|cohort,
       family = gaussian(link = "log"),
       data = dd)

相关问题