混合效应模型代码中的错误:“(p <- ncol(X)) == ncol(Y) is not TRUE”和 "variable lengths differ"
Errors in Mixed Effects Model Code: "(p <- ncol(X)) == ncol(Y) is not TRUE" and "variable lengths differ"
我是 R 编码的新手,我第一次尝试 运行 混合效果模型。我的模型旨在研究一个物种的种群趋势对另一个物种的种群趋势随时间的影响(年份被列为固定效应),状态是随机效应(因为数据是由国家报告的,但我是只看大陆效应)。
这是我的数据设置片段(table 称为 IGP):
species state Count_yr population_value
1 A AL 1970 0.1615
2 B AL 1970 0.1981
3 C AL 1970 0.2162
4 A KY 1971 0.2096
5 B KY 1971 0.2118
6 C KY 1971 0.2784
我对数据进行了子集化以将所有三个物种分开(A 的 1 个子集,B 的 1 个子集,C 的 1 个子集)如下:
A <- subset(IGP, IGP$species=="A")
B <- subset(IGP, IGP$species=="B")
C <- subset(IGP, IGP$species=="C")
对于只关注一个物种的线性模型,一切正常:
Alm <- lm(A$population_value ~ A$Count_yr+A$state)
但是当对所有 3 个物种进行混合效果模型时,事情变得棘手
合并:
lmer<-lmer(A$population_value ~ B$Count_yr*B$population_value +
C$Count_yr*C$population_value + (1|state)
首先,我遇到了一个“可变长度不同”的错误,所以我进去并手动添加了 NA 多年 and/or 没有其中一个物种的数据值的状态。我检查以确保所有年份都有相同数量的数据点并且所有州都有相同数量的数据点,所以我认为此后不会出现问题。
然而,一旦我添加了 NA,我就开始收到错误“(p <- ncol(X)) == ncol(Y) is not TRUE”,这似乎是由于因子列中有 NA 值。放弃对其他 post 的建议,我使用 na.omit 解决了这个问题,但后来我又遇到了“可变长度不同”的错误(似乎是一个我不知道如何无限循环的循环修复)。
如果有人可以指导我如何进行,我将不胜感激!我对统计或编码不是很了解,所以请让我知道是否有任何其他信息可以添加到 post 中以使事情更清楚。提前致谢!
我认为您应该将数据从长格式转换为宽格式。 tidyr::pivot_wider()
是一种方法(但还有其他方法,例如 reshape
in base R 或 plyr::melt()
/cast()
)。
长格式示例数据:
dd <- expand.grid(species=c("A","B","C"),
state=c("AL","KY","TN"),
Count_yr=1970:1974)
set.seed(101)
dd$pop <- rnorm(nrow(dd))
转换为宽屏:
ddw <- tidyr::pivot_wider(dd, id_cols=c(state,Count_yr),
names_from=species, values_from=pop,
names_prefix="pop_")
names(ddw)
## [1] "state" "Count_yr" "pop_A" "pop_B" "pop_C"
适合模特:
library(lme4)
lmer(pop_A ~ scale(Count_yr)*(pop_B+pop_C) + (1|state), data=ddw)
我是 R 编码的新手,我第一次尝试 运行 混合效果模型。我的模型旨在研究一个物种的种群趋势对另一个物种的种群趋势随时间的影响(年份被列为固定效应),状态是随机效应(因为数据是由国家报告的,但我是只看大陆效应)。
这是我的数据设置片段(table 称为 IGP):
species state Count_yr population_value
1 A AL 1970 0.1615
2 B AL 1970 0.1981
3 C AL 1970 0.2162
4 A KY 1971 0.2096
5 B KY 1971 0.2118
6 C KY 1971 0.2784
我对数据进行了子集化以将所有三个物种分开(A 的 1 个子集,B 的 1 个子集,C 的 1 个子集)如下:
A <- subset(IGP, IGP$species=="A")
B <- subset(IGP, IGP$species=="B")
C <- subset(IGP, IGP$species=="C")
对于只关注一个物种的线性模型,一切正常:
Alm <- lm(A$population_value ~ A$Count_yr+A$state)
但是当对所有 3 个物种进行混合效果模型时,事情变得棘手 合并:
lmer<-lmer(A$population_value ~ B$Count_yr*B$population_value +
C$Count_yr*C$population_value + (1|state)
首先,我遇到了一个“可变长度不同”的错误,所以我进去并手动添加了 NA 多年 and/or 没有其中一个物种的数据值的状态。我检查以确保所有年份都有相同数量的数据点并且所有州都有相同数量的数据点,所以我认为此后不会出现问题。 然而,一旦我添加了 NA,我就开始收到错误“(p <- ncol(X)) == ncol(Y) is not TRUE”,这似乎是由于因子列中有 NA 值。放弃对其他 post 的建议,我使用 na.omit 解决了这个问题,但后来我又遇到了“可变长度不同”的错误(似乎是一个我不知道如何无限循环的循环修复)。 如果有人可以指导我如何进行,我将不胜感激!我对统计或编码不是很了解,所以请让我知道是否有任何其他信息可以添加到 post 中以使事情更清楚。提前致谢!
我认为您应该将数据从长格式转换为宽格式。 tidyr::pivot_wider()
是一种方法(但还有其他方法,例如 reshape
in base R 或 plyr::melt()
/cast()
)。
长格式示例数据:
dd <- expand.grid(species=c("A","B","C"),
state=c("AL","KY","TN"),
Count_yr=1970:1974)
set.seed(101)
dd$pop <- rnorm(nrow(dd))
转换为宽屏:
ddw <- tidyr::pivot_wider(dd, id_cols=c(state,Count_yr),
names_from=species, values_from=pop,
names_prefix="pop_")
names(ddw)
## [1] "state" "Count_yr" "pop_A" "pop_B" "pop_C"
适合模特:
library(lme4)
lmer(pop_A ~ scale(Count_yr)*(pop_B+pop_C) + (1|state), data=ddw)