【发布时间】:2019-03-13 21:35:04
【问题描述】:
为了简化重现性,我使用来自ResourceSelection 包的goats 数据集,其中包含山羊的已使用(STATUS == 1) 和“可用”(STATUS == 0) GPS 位置的空间数据。 ID 用于个人 (n = 10),ELEVATION, ... , TASP 是点的属性。
library(ResourceSelection)
head(goats)
STATUS ID ELEVATION SLOPE ET ASPECT HLI TASP
1 1 1 651 38.5216 35.3553 243.1131 0.9175926 0.9468804
2 1 1 660 39.6927 70.7107 270.0000 0.8840338 0.6986293
3 1 1 316 20.5477 50.0000 279.2110 0.7131423 0.5749115
4 1 1 334 34.0783 35.3553 266.1859 0.8643775 0.7447368
5 1 1 454 41.6187 25.0000 258.3106 0.9349181 0.8292587
6 1 1 343 28.4694 103.0776 237.0426 0.8254866 0.9756112
我想为按Season(在下面创建)分组的每个人设置一个glm,但模型结构会因季节而异。我一直在使用一些有用的SO posts 和其他resources,但它们都适合每个组的单个模型,而我想为每个Season 分组设置不同的模型。
#Add a new `Season` field
library(tidyverse)
goats <- goats %>%
mutate(Season = if_else(ID %in% 1:3, "Summer",
if_else(ID %in% 4:7, "Winter", "Fall")))
下面我创建一个模型构建函数,并使用if else指定每个季节特定的模型。
SeasonalMods <- function(df) {
#Models for Archery
if(Season == "Summer") {
glm(STATUS ~ SLOPE + I(SLOPE^2), data = df)
#Models for Winter
} else if (Season == "Winter") {
glm(STATUS ~ SLOPE + ASPECT + TASP, data = df)
#Models for Fall
} else if (Season == "Fall") {
glm(STATUS ~ ELEVATION + SLOPE + ET + ASPECT + HLI + TASP, data = df)}
}
然后我尝试将函数映射到分组数据并创建新的列表列,如下所示。
ModelFits <- goats %>%
group_by(Season, ID) %>%
nest() %>%
mutate(fits = map(data, SeasonalMods),
tidied = map(fits, tidy),
glanced = map(fits, glance),
augmented = map(fits, augment))
这会产生以下错误:
Error in mutate_impl(.data, dots) :
Evaluation error: object 'Season' not found
我不确定如何在SeasonalMods 函数中正确指定Season,以便map() 可以解释它。
我尝试在if 和else if 语句中的Season 前面添加df$,但这也会产生错误。
【问题讨论】:
-
你见过
modelr包吗?不确定它是否会帮助modelr.tidyverse.org/reference/fit_with.html -
仔细观察你的函数,你函数中的
ifs 并不知道Season是df中的一个列。您可以将Season作为参数。还要记住if语句只查看列表或向量中的第一个元素,这与向量化的ifelse不同 -
@camille
modelr看起来很有希望。我也会对此进行调查。至于第二条评论,是的,你说得对,我没有正确识别Season,但我不知道该怎么做。正如您所建议的那样,我将如何“将Season作为论据”...?