R:在混合模型效果中绘制RANEF

时间:2015-12-14 19:54:04

标签: r plot lme4 mixed-models

所以我对R来说相当新。我正在研究一个带有数据集的项目,看看鸟类的年龄。我们有来自95个人的> 400,000个观测值。我的任务是:

“如果它的线条旁边有一些数据点,那么这个图表会更有说服力。你可以在lme4中的getcall中获取ranef的数据点。所以,运行没有年龄和年龄2的模型。然后,拉出来随机效应项(每个人的值),然后绘制它们(y =随机效应,x =年龄)。“

这是有问题的图表(它是使用我们的模型在Excel中制作的):Graph

所以我跑了这个

> lmbdna<-lmer(Gs ~ (1 | Individual) + Bin + year + Mass)
> ranef(lmbdna)
>$Individual

> plot(Age, ranef(lmbdna))

我得到了这个

  

xy.coords(x,y,xlabel,ylabel,log)中的错误:     'x'和'y'长度不同

我真的迷失了,我不知道如何将ranefs绘制到这个时代。有没有办法将年龄与个人联系起来摆脱这个错误?

以下是我的一些数据:

Indiv   Age Mass   MaxDepth Depth       Gs       PDBA  Bin year
69903   12  1015    3.806   3.025   0.1854302   92.7151 A   N
52712   20  957.5   3.806   3.025   0.204678    102.339 A   T
55969   19  1002.5  3.806   3.025   0.222338    111.169 A   T
64442   15  1040    3.806   3.025   0.1872954   93.6477 A   T
76252   11  940     3.806   3.025   0.223136    111.568 A   T
53391   21  1022.5  3.806   3.025   0.234452    117.226 A   E
53391   21  1022.5  3.806   3.025   0.299438    149.719 A   E
60117   18  937.5   3.806   3.025   0.1469442   73.4721 A   E
60151   18  970     3.806   3.025   0.1941052   97.0526 A   E
52712   20  957.5   3.855   3.025   0.1812926   90.6463 A   T
52712   20  957.5   3.855   3.025   0.25101     125.505 A   T
64442   15  1040    3.855   3.025   0.1850976   92.5488 A   T
64442   15  1040    3.855   3.025   0.1026478   51.3239 A   T
76252   11  940     3.855   3.025   0.235822    117.911 A   T
78712   10  880     3.855   3.025   0.1638106   81.9053 A   T
87819   7   1000    3.855   3.025   0.166391    83.1955 A   T
90281   6   957.5   3.855   3.025   0.1493948   74.6974 A   T
60151   18  970     3.855   3.025   0.1904232   95.2116 A   E
69944   12  915     3.904   3.025   0.256504    128.252 A   N
3260    24  960     3.904   3.025   0.168019    84.0095 A   T
52712   20  957.5   3.904   3.025   0.270704    135.352 A   T
64442   15  1040    3.904   3.025   0.1507102   75.3551 A   T
71432   12  970     3.904   3.025   0.1238154   61.9077 A   T
80538   15  917.5   3.904   3.025   0.236976    118.488 A   E
76583   14  870     3.952   3.025   0.295982    147.991 A   N
84420   7   1005    3.952   3.025   0.1861876   93.0938 A   N
87819   7   1000    3.952   3.025   0.178179    89.0895 A   T
53391   21  1022.5  3.952   3.025   0.1917954   95.8977 A   E
53391   21  1022.5  3.952   3.025   0.1482036   74.1018 A   E
53391   21  1022.5  3.952   3.025   0.1999868   99.9934 A   E
53391   21  1022.5  3.952   3.025   0.276334    138.167 A   E
60151   18  970     3.952   3.025   0.1776108   88.8054 A   E
80538   15  917.5   3.952   3.025   0.188733    94.3665 A   E
69944   12  915     4.001   3.025   0.2596      129.8   A   N
3260    24  960     4.001   3.025   0.1824546   91.2273 A   T

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:0)

主要问题是您提取的随机效果是每个人,而您尝试绘制的年龄数据是针对每个观察。您需要将其汇总到单个级别(例如,在所有观察中为每个人获取最大值以获得您要查找的结果。下面的示例使用您在上面提供的文本。

不确定这是否是你所追求的,但主要问题是你的矢量长度不同。希望下面的代码能给你一些想法。获得更大的数据样本本来很棒。

require(lme4)

# the data snapshot supplied above only contains one level of the factor bin, let's add another
dta[dta$Indiv < 7000, "Bin"] <- "B"

# estimate model
lmbdna <- lmer(Gs ~ (1 | Indiv) + Bin + year + Mass, dta)

# random effects are for indivuals, so need to aggregate individuals' ages
plt_dta <- aggregate(dta$Age, by = list(dta$Indiv), max)

# create one dataset by merging with random effects
plt_dta <- merge(plt_dta, ranef(lmbdna)$Indiv, by.x = 1, by.y = 0)

# plot data
plot(plt_dta[,2], plt_dta[,3], xlab = "age", ylab = "ranef")

答案 1 :(得分:0)

我认为我们不能根据您分享的数据获得有意义的模型,所以让我们使用类似?ranef中的示例:

library("lme4")
fm1 = lmer(Reaction ~ Days + (1 | Subject), data = sleepstudy)

my_ranef = ranef(fm1)
str(my_ranef)
# List of 1
#  $ Subject:'data.frame':  18 obs. of  1 variable:
#   ..$ (Intercept): num [1:18] 40.78 -77.85 -63.11 4.41 10.22 ...
#  - attr(*, "class")= chr "ranef.mer"

str()对于查看对象的结构非常有用。在这里,我们可以看到my_ranef是一个项目的列表,该项目是一个数据框(名为Subject),包含18行和1列(名为(Intercept))。让我们仔细看看数据框:

head(my_ranef$Subject)
#     (Intercept)
# 308   40.783710
# 309  -77.849554
# 310  -63.108567
# 330    4.406442
# 331   10.216189
# 332    8.221238

因此,数据框具有与每个主题对应的行名,然后随机效果截距位于(拦截)列中。所以我们可以像这样绘制随机效应:

plot(row.names(my_ranef$Subject), my_ranef$Subject[, "(Intercept)"])

你遇到的问题是你给整个列表或数据框作为你的情节的y参数,而你只需要提取矢量。

我们还可以提取随机效应

est_ranef = my_ranef$Subject[, "(Intercept)"]

(请注意,括号会使"(Intercept)"成为非标准列名称,这会在提取它时增加一些难度,简单的$无效 a la { {1}},但我们可以使用my_ranef$Subject$(Intercept)和上面引用的列名,或者反引词可以与[一起使用,如下所示:

$

如果您查看my_ranef$Subject$`(Intercept)` 更复杂的模型,您会看到为什么使用数据框架结构列表。