【发布时间】:2014-11-05 19:26:16
【问题描述】:
我在question I recently asked 上得到了很多很好的反馈,并被指导使用 dplyr 来转换一些数据。我遇到了 lm() 的问题,并试图从这些转换后的数据中找到一个斜率,并认为我会提出一个新问题。
首先我有如下数据:
Var1 Var2 Var3 Time Temp
a w j 9/9/2014 20
a w j 9/9/2014 15
a w k 9/20/2014 10
a w j 9/10/2014 0
b x L 9/12/2014 30
b x L 9/12/2014 10
b y k 9/13/2014 20
b y k 9/13/2014 15
c z j 9/14/2014 20
c z j 9/14/2014 10
c z k 9/14/2014 11
c w l 9/10/2014 45
a d j 9/22/2014 20
a d k 9/15/2014 4
a d l 9/15/2014 23
a d k 9/15/2014 11
我希望它采用这种形式(模拟斜率和皮尔逊的值以进行说明):
V1 V2 V3 Slope Pearson
a w j -3 -0.9
a w k 2 0
a d j 1.5 0.6
a d k 0 0.5
a d l -0.5 -0.6
b x L 12 0.7
b y k 4 0.6
c z j -1 -0.5
c z k -3 -0.4
c w l -10 -0.9
斜率是线性最小二乘斜率。理论上,脚本应该是这样的:
library(dplyr)
data <- read.table("clipboard",sep="\t",quote="",header=T)
newdata = summarise(group_by(data
,Var1
,Var2
,Var3
)
,Slope = lm(Temp ~ Time)$coeff[2]
,Pearson = cor(Time, Temp, method="pearson")
)
但是 R 会抛出一个错误,比如找不到时间或温度。它可以运行lm(data$Temp ~ data$Time)$coeff[2],但返回整个数据集的斜率,而不是我正在寻找的子集形式。 cor() 似乎在group_by 部分运行得很好,所以我需要传递给lm() 的特定语法以使其以类似的方式运行或完全使用不同的函数来获得从子集?
【问题讨论】:
-
这里的一个问题是你在按 Var1 和 Var2 和 Var3 分组时没有足够的不同值,所以线性回归是不可能的
-
另一个问题是您要检查
Time和Temp之间的确切相关性?Time是一个日期,皮尔逊相关需要两个数值向量 -
您可以查看
?do示例,它们在分组数据上运行lm模型,并从每个模型中提取统计数据。 -
我添加了一个如何使用一些虚拟变量计算皮尔逊相关性的示例
-
还添加了一个可能的
data.table解决方案