随着时间的推移,我有一系列的分数,我希望在这些点上拟合曲线,然后找到曲线下面的区域。我可以这样做:
fit<-loess(mass ~ hour, df)
f <- function(x) predict(fit,newdata=x)
answer<-integrate(f, 0, 60)$value
到目前为止,这么好,但我的问题是我有重复点。我想要每个复制的拟合和值。
trt rep hour mass
y a 1 3
y a 2 5
y a 3 8
y a 4 6
y b 1 2
y b 2 3
y b 3 5
y b 4 4
n c 1 4
n c 2 6
n c 3 8
n c 4 7
n d 1 5
n d 2 7
n d 3 8
n d 4 7
我想dplyr::group_by(rep)
,但分组不会传到fit
。我也可以在nlme
中进行分组并使用nlsList
,但该套件在loess
或一般多项式方面效果不佳。
答案 0 :(得分:2)
似乎do()
的情况。使用您的样本数据
dd <- read.table(text="trt rep hour mass
y a 1 3
y a 2 5
y a 3 8
y a 4 6
y b 1 2
y b 2 3
y b 3 5
y b 4 4
n c 1 4
n c 2 6
n c 3 8
n c 4 7
n d 1 5
n d 2 7
n d 3 8
n d 4 7 ", header=T)
和您的区域计算
get_area <- function(df) {
fit <- loess(mass ~ hour, df)
f <- function(x) predict(fit,newdata=x)
integrate(f, 0, 60)$value
}
你可以运行
dd %>% group_by(rep) %>% do(area=get_area(.))