【问题标题】:Trying to run an ANOVA for fields in a dataframe [R]尝试对数据框中的字段运行 ANOVA [R]
【发布时间】:2016-01-26 15:25:34
【问题描述】:

到目前为止,我的代码如下所示:

Points = readOGR(dsn = "./Data/filename.shp",layer = "layername",stringsAsFactors = FALSE) 
Points$LDI = extract(LDI, Points) 
LDI = raster("./Data/filename2.tif")
Points$LDI = extract(LDI, Points)
PointsDF = Points@data

for(i in PointsDF) { 
    Mod1 = lm(LDI ~ i, data = PointsDF) 
    Mod2 = lm(LDI ~ 1, data = PointsDF) 
    anova(Mod1, Mod2)
}

最后一部分是我知道我做错一切的地方。我想在数据框中的每个数字字段上运行方差分析。

【问题讨论】:

  • 我没有足够的时间来给出正确的答案。但您的解决方案可能是使用 apply() 函数而不是循环。在 R 中,矢量化通常比循环更可取
  • 我会试试看的!谢谢

标签: r dataframe anova


【解决方案1】:

你已经接近了。一种自然的方法是遍历字段名称。尽管有很多方法可以做到这一点,lapply 可能是最惯用的,因为 (a) 它使用字段名称(而不是字段索引,这可能很危险)并且 (b) 不需要为输出。诀窍是将字段名称转换为公式。同样,有很多方法可以做到这一点,但直接的方法是将公式组装为字符串。

这里以工作代码为例。它会生成一个anova 对象列表。

#
# Create some random data.
#
n <- 20
set.seed(17)
X <- data.frame(Y=rnorm(n), X1=runif(n), X2=1:n, X3=rexp(n))
#
# Loop over the regressors.
# (The base model can be precomputed.)
#
mod.0 <- lm(Y ~ 1, X)
models <- lapply(setdiff(names(X), "Y"), function(s) {
  mod.1 <- lm(as.formula(paste("Y ~", s)), X)
  anova(mod.0, mod.1)
})
print(models)

这是输出,显示了三个anova 结果的列表。

[[1]]
Analysis of Variance Table

Model 1: Y ~ 1
Model 2: Y ~ X1
  Res.Df     RSS Df Sum of Sq     F Pr(>F)
1     19 10.1157                          
2     18  9.6719  1   0.44385 0.826 0.3754

[[2]]
Analysis of Variance Table

Model 1: Y ~ 1
Model 2: Y ~ X2
  Res.Df     RSS Df Sum of Sq      F  Pr(>F)  
1     19 10.1157                              
2     18  8.1768  1     1.939 4.2684 0.05353 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

[[3]]
Analysis of Variance Table

Model 1: Y ~ 1
Model 2: Y ~ X3
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     19 10.116                           
2     18 10.081  1  0.034925 0.0624 0.8056

作为使用您生成的内容的另一个示例,这里是 sapply 用于打印它们的 p 值:

sapply(models, function(m) m[["Pr(>F)"]][2])

[1] 0.37542968 0.05352883 0.80562894

【讨论】:

  • 感谢您抽出宝贵时间正确指定此分析。我从字面上翻译了对操作代码的更正,并不觉得有必要更正分析。
  • 这很有帮助(尽管现在我收到了一个错误,即数据集的大小不同)。我想这绝对是我需要的。
【解决方案2】:

问题是你没有告诉循环它正在迭代什么,在 anova 调用中定义一个公式对象,也没有创建一个对象来存储结果。

在本例中,“ij”变量分配给列表对象并存储方差分析模型,“y”定义为表示模型左侧的变量。列表对象“anova.results”存储每个模型。循环定义中的索引使用“which”来分配包含“y”的列,因此,将其从迭代器中删除。我正在使用 R“iris”数据集作为示例。

data(iris)
iris <- iris[,-5]

y = "Sepal.Length"    
anova.results <- list()
ij=0
  for(i in names(iris)[-which(names(iris) == y)]) {
    ij = ij+1
    Mod = lm(stats::as.formula(paste(y, i, sep = "~")), data = iris) 
    anova.results[[ij]] <- anova(Mod, Mod)
  }
anova.results

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多