2013-03-13 52 views
0

我正在嘗試使用fitdistr函數,並且一直在閱讀walkthrough「適用於R的分佈」。我可以使用「虛擬數據」來跟蹤概述的示例,但是當我嘗試使用此函數運行我的實際數據時,出現了問題。 我相信這個問題是由於我的數據中存在標題,因爲我不斷得到相同的錯誤。例如,如果我通過了第2列運行我的數據(2列有頭):在MASS庫中使用fitdistr

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組,根據直徑大小。對於每個組,我都看着所看到的優勢分佈。

+1

您可以將您的數據的樣品放入你的問題,使用'dput更換(頭(yourdat))'?數據的細節似乎是問題的核心...... – Ben 2013-03-13 17:11:23

回答

1

看起來你的數據集的第一行是作爲數據而不是頭部讀入的,當你試圖在整個列上運行fitdistr時,它將它視爲字符向量而不是數字。

如果您正在使用read.csv或類似文件讀取您的數據,請嘗試添加選項 header = T。

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

可以驗證一列是如果這是字符類型的,那麼有可能在你的輸入文件中的錯誤值某處

class(data$col2) 

數字矢量。

如果你認爲你的數據是好的,你可以嘗試

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

而且任何錯誤值將與NA的

+0

'as.numeric'似乎已經爲我清除了。謝謝! – 2013-03-13 18:07:46

+1

'read.csv(file,header = TRUE)'的第二個參數是多餘的。這是默認設置。如果在數字中有一個字符值,那麼類不會是「字符」,而是「factor」,因爲stringsAsFactor默認爲TRUE。然後'typeof'將返回'integer',這會引起誤解,但這是因子向量的'typeof'。最好的做法是使用colClasses。 – 2013-03-13 18:28:18