【问题标题】:invalid type (list) for variable变量的无效类型(列表)
【发布时间】:2018-04-18 00:19:16
【问题描述】:

我正在尝试在 R 中运行方差分析模型。我有一个包含 3 行和 12 列的数据文件。每行是解释变量特定水平的数据。单元格 [i,j] 是级别 i 的第 j 个响应。该文件是“.dat”扩展名。我正在运行以下 R 代码以尝试获取 36 x 2 数据帧来运行 anova 模型,而不是 3 x 12 原始数据帧:

data <- read.table("usedcar.dat", row.names = 1)
young <- data[1,]
med <- data[2,]
old <- data[3,]
Price <- c(young, med, old)
Age <- as.factor(c(rep(1,12), rep(2,12), rep(3,12)))
data <- cbind(Age, Price)
data <- as.data.frame(data)

但是当我尝试从中取出 anova 模型时,我得到了无效的列表类型错误:

m1 <- aov(Price ~ Age, data = data)
Error in model.frame.default(formula = Price ~ Age, data = data, drop.unused.levels = TRUE) : invalid type (list) for variable 'Price'

我在这里做错了什么?

如果有帮助,这里有一个随机矩阵:

replicate(12, rnorm(3))

这里是 str(data) 结果:

str(data)
'data.frame':   36 obs. of  2 variables:
 $ Age  :List of 36
  ..$ 1 : int 1
  ..$ 2 : int 1
  ..$ 3 : int 1
  ...
  ..$ 36: int 3
 $ Price:List of 36
  ..$ 1 : int 2300
  ...
  ..$ 36: int 2075

【问题讨论】:

  • 能否请您提供确切的错误信息?
  • 这也有助于使您的示例可重现,即包含一个生成错误的小数据集
  • 如果您要为模型提供 data 参数,则不应在公式中子集 ($):aov(Price ~ Age, data = data)
  • 同样的错误与 aov(Price~Age,data=data) :(
  • 鉴于错误,我会查看str(data);您的砍伐似乎已将Price 作为列表列。

标签: r anova


【解决方案1】:

来自lm 或其他基于公式的函数的错误消息invalid type (list) for variable x 通常表明变量x 需要一个向量,而是一个列表。调试错误的标准模型是检查str(data_frame_name$x) 的结果(其中data_frame_name 是包含x 的数据框)。通常,您会发现 x 并不是您所期望的数据类型。

【讨论】:

    【解决方案2】:

    tl;dr 行数据框是列表,而不是数字向量。当您read.table() 时,您会得到一个数据框(因此像我之前所做的那样构造一个矩阵不会复制问题)。

    data <- as.data.frame(matrix(rnorm(36),nrow=3))
    young <- data[1,]; med <- data[2,]; old <- data[3,]
    Price <- c(young, med, old)
    str(Price)
    ## ## List of 36
    ## ##  $ V1 : num 0.648
    ## ##  $ V2 : num 0.157
    ## ## ...
    

    这是一个列表,而不是数字向量,这是一个问题。 有多种处理方法。最简单的是unlist()

    dd <- data.frame(Age,Price=unlist(Price))
    aov(Price~Age,dd)
    

    【讨论】:

    • 我认为问题与我从 .dat 文件中以数据框的形式读取数据有关?
    • unlist() 可能需要分别应用于每一列。当我将它应用于整个数据框时,它会将数据框变成一个长向量。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    相关资源
    最近更新 更多