我在下面创建了2个数据帧,例如dat1
和dat2
。
在dat1
中,有3个人(ID
a:d)属于两个位置(loc1
和loc2
)。
dat2
包含对dat1
中每个人的单个观察结果,以及我想将idx
中的数据子集化的索引(dat1
)。
library(tidyverse)
library(mgcv)
dat1 <- data.frame(ID = rep(c("a","b","c","d"), each = 100),
location = rep(c("loc1","loc2"), each = 200),
distance = rep(c(1:100), times = 4),
var1 = rnorm(400))
dat2 <- data.frame(ID = c("a","b","c","d"),
idx = c(58,50,67,62))
我正在编写此函数:
working <-
function(id){
x <- dplyr::filter(data, number == id)
v <- dplyr::filter(IndexData, number == id)
v <- as.numeric(v[5])
x <- x[1:v, ]
x <- mutate(x, idx = row_number())
edf = 10*(v^(2/9))
edf = ceiling(edf)
edf
Location <- paste(x[1,1])
modname <- paste(Location,id,"mod", sep="")
paste(modname) <- gam(x$Var1 ~ s(idx, bs="tp", k=edf), data = x, method = "REML")
fit.line <- predict(paste(modname), se=T)$fit
se.line <- predict(paste(modname), se=T)$se.fit
}
总而言之,我想给函数一个id
(即id a
),它将在id
中查找dat2
,得到{{1 }}号与该idx
对应(例如,对于ID id
,它将是数字58)。该索引定义了我希望对其进行子集a
的范围的边界(例如,它将子集dat1
中ID为dat1
的前58个观察结果的子集)。然后,我希望它创建一个基于子集的a
和id
命名的模型。这是我无法正常工作的地方。因此,例如,对于ID location
,它将适合名为a
的模型。我希望它实际上将其创建为一个对象,以便我可以查看和使用该模型,但它不喜欢我试图实现此目的的方式。我需要更改什么?
如果这不会变得复杂,我还希望每次我给它Loc1amod
时自动生成一个包含原始数据,gam配置文件和置信带的折线图。 / p>