【问题标题】:Using fitdistr in the MASS library在 MASS 库中使用 fitdistr
【发布时间】:2018-08-06 11:01:19
【问题描述】:

我正在尝试使用 fitdistr 函数,并且一直在阅读“使用 R 拟合分布”的演练。我可以使用“虚拟数据”按照概述的示例进行操作,但是当我尝试使用此函数运行实际数据时会出现问题。 我相信问题是由于我的数据中存在标题,因为我经常遇到同样的错误。例如,如果我运行我的数据(带标题的 2 列),通过第 2 列:

fitdistr(data$col2,"gamma")   
'x' must be a non-empty numeric vector'

我尝试从我的文件中删除标题并尝试对我的所有数据(未合并)使用该函数,这也导致了同样的错误。

接下来,我尝试删除标题,并且只在数据文件中包含我想要运行函数的数据列。这确实运行正常。

请注意,对于我的数据,第二列是我有兴趣运行的。但是我已经使用第一列数据将第二列分为 20 个不同的组,所以我确实需要数据集中的第一列。我可以很容易地删除标题并在单独的代码中运行 fitdistr() (因为到目前为止我一直在使用标题来调用列),但是我看不到如何只用一列数据运行这个函数,并且仍然有该数据正确分类。我的第一个直觉是在 excel 中对数据进行分类,然后有 20 个不同的 1 列数据集来运行该函数。这似乎很乏味,因此非常感谢有关如何在数据集完整的情况下执行此功能的任何提示。

这里要求是我的数据样本:

> dput(head(Diam_Str))
structure(list(Diameter = c(0.03, 0.05, 0.05, 0.05, 0.05, 0.05
), Strength = c(0.2, 0.2, 1.5, 0.5, 0.6, 0.3)), .Names = c("Diameter", 
"Strength"), row.names = c(NA, 6L), class = "data.frame")

所以我有 20 个组,根据直径大小。对于每个组,我正在查看所看到的优势分布。

【问题讨论】:

  • 您可以使用dput(head(yourdat)) 在您的问题中添加一个数据样本吗?数据的细节似乎是问题的核心……

标签: r


【解决方案1】:

您的数据集的第一行似乎是作为数据而不是标题读入的,当您尝试在整个列上运行 fitdistr 时,它会将其视为字符向量而不是数字。

如果您正在使用 read.csv 或类似文件读取数据,请尝试添加选项 标头=T。

data = read.csv("file.txt", header=T)

你可以验证一列是一个数字向量

class(data$col2)

如果这是类型字符,那么您的输入文件中的某处可能存在错误值。

如果你觉得你的数据没问题,可以试试

fitdistr(as.numeric(data$col2),"gamma")

并且任何不好的值都将被替换为 NA's

【讨论】:

  • 'as.numeric' 似乎已经为我解决了这个问题。谢谢!
  • read.csv(file, header=TRUE) 的第二个参数是多余的。这是默认设置。如果在应该是数字的内容中有一个字符值,则该类将不是“字符”,而是“因子”,因为 stringsAsFactor 默认情况下为 TRUE。然后typeof 将返回integer,这会产生误导,但这是因子向量的typeof。最好的做法是使用 colClasses。
猜你喜欢
  • 1970-01-01
  • 2018-01-21
  • 2016-01-07
  • 1970-01-01
  • 2012-06-25
  • 2017-10-03
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多