尝试使用聚合对列中的值子集运行线性模型

Cat*_*ick 5 aggregate r function subset

我大约有7500个沉降值。每个沉降值(V9)对应一个测站(V2)和一个年份(V3)。我想为每个站设置一条最合适的线(V9〜V3)。

我使用lm创建了一个函数,该函数在手动子集数据时可以正常工作。但是,当我尝试使用聚合在每个工作站上运行线性模型时,每个工作站都会获得相同的值。

这是一些数据的示例:

V2        V3    V9
CRMS0002  2008  -28.4990000
CRMS0002  2009  -28.8080808
CRMS0002  2012  -31.9871795
CRMS0006  2008  -56.8998413
CRMS0006  2013   40.8611111
CRMS0006  2015   32.8555555
CRMS0033  2007  -16.8044444
Run Code Online (Sandbox Code Playgroud)

这是代码:

sub_rate = function(x) {lm(CRMSsub$V9~CRMSsub$V3)}
agg <- aggregate(CRMSsub$V9, by = list(CRMSsub$V2), FUN = sub_rate)
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

agg <- lapply(split(CRMSsub, CRMSsub$V3), FUN = sub_rate)
Run Code Online (Sandbox Code Playgroud)

根据第一和第二代码的一部分进行汇总。因此,我得到了354个按工位组织的元素,但是每个工位的线性模型结果(分别给出截距和斜率)相同,这意味着它无法按工位执行功能。这是结果的示例:

Group.1         x
CRMS0002        c(`(Intercept)` = -2333.06378840009, `CRMSsub$V3` = 1.1541441797906)
CRMS0006        c(`(Intercept)` = -2333.06378840009, `CRMSsub$V3` = 1.1541441797906)
CRMS0033        c(`(Intercept)` = -2333.06378840009, `CRMSsub$V3` = 1.1541441797906)
Run Code Online (Sandbox Code Playgroud)

ale*_*555 2

您的方法的问题是您在 的调用中指定了数据集sub_rate。您还需要指定数据集,如x中所示lapply()。例如你可以这样做:

library(dplyr)

sub_rate <- function(x){lm(x$V9~x$V3)}

lapply(CRMSsub %>% split(.$V2),sub_rate)
Run Code Online (Sandbox Code Playgroud)