R时间序列ddply

问题描述:

我有一个数据库(每个下面的简化格式)与城市,不同日期和这些日期的温度。我想为每个城市计算一段时间内的趋势,以及这种趋势是否显着。R时间序列ddply

我想我必须以某种方式将ddply与lm函数(例如lm(date〜temp))和一个适合系数的调用结合在一起,但不知道如何执行此操作....

可能有一个更简单的解决方案 - 非常感谢帮助我;

W¯¯

City Date Temp (Celcius) 
Amsterdam Jan-01 21 
Amsterdam Mar-01 23 
Amsterdam May-01 25 
Barcelona Feb-01 20 
Barcelona Mar-01 19 
Barcelona May-01 25 
Copenhagen Jan-01 19 
Copenhagen Feb-01 23 
Copenhagen May-01 22 

我想:

这是我的尝试:

tempdata=read.csv("tempfile.csv", header=TRUE, sep=",", as.is=TRUE) 
tempdata$Date <- as.Date(tempdata$Date, "%d/%m/%Y") 

funcreg = function(x) {regmodel=lm(tempdata$Date ~ tempdata$Temperature) 
return(data.frame(regmodel$coefficients[2])) 

} 

ddply(tempdata, .(City), funcreg) 

给出的输出:

 City regmodel.coefficients.2. 
1 Amsterdam     14.71244 
2 Barcelona     14.71244 
3 Copenhagen     14.71244 

Dput:

structure(list(City = c("Amsterdam", "Amsterdam", "Amsterdam", 
"Barcelona", "Barcelona", "Barcelona", "Copenhagen", "Copenhagen", 
"Copenhagen"), Date = c("01/01/2001", "01/03/2001", "01/05/2001", 
"01/02/2001", "01/03/2001", "01/05/2001", "01/01/2001", "01/02/2001", 
"01/05/2001"), Temperature = c(21L, 23L, 25L, 20L, 19L, 25L, 
19L, 23L, 22L), X = c(NA, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("City", 
"Date", "Temperature", "X"), class = "data.frame", row.names = c(NA, 
-9L)) 
+1

使用'x',而不是'tempdata'内'funcreg'。您可能还想考虑一下,您的哪些变量是独立的,哪些是独立的。 – Roland

+0

谢谢 - 非常感谢 - 解决了它。愚蠢的错误在我身上。我在写作方面是新手。有一个问题引向另一个问题 - 我也在回归的p值和t值中加入。但是 - 返回函数只允许输出一个变量。我可以运行多个函数,并将数据帧合并到一起,但我想知道是否有更智能的方法。 – user1885116

+0

@罗兰,也许把你的评论作为答案,以便问题可以被标记为解决? –

使用x而不是tempdata里面的funcreg。你也应该在回归中切换你的变量。温度显然是这里的依赖。

tempdata$Date <- as.Date(tempdata$Date,'%d/%m/%Y') 

funcreg = function(x) { 
    regmodel <- lm(Temperature ~ Date, data=x) 
    data.frame(trend = regmodel$coefficients[2], 
       p = summary(regmodel)$coef["Date","Pr(>|t|)"])      
} 

library(plyr) 
ddply(tempdata, .(City), funcreg) 

     City  trend   p 
1 Amsterdam 0.03333025 0.006125688 
2 Barcelona 0.06301304 0.298501483 
3 Copenhagen 0.01696590 0.660997625