“x”中的PCA错误无限或缺失值

时间:2014-07-29 19:46:29

标签: r

我一直在努力使用R来分析财务数据。我是一般的编程新手,真的,除非习惯于在Excel中工作。因此,我花了很多时间(可能是太多时间)格式化我的CSV文件,这样我就可以最大限度地减少在R中工作时的麻烦,但这没有用。

这是我的PCA分析代码。当我使用没有N / As或空白的较小数据文件时,我只能使它工作,但我需要知道如何在R中处理这些。

returns <- read.csv("PCA Data File.csv", skip = 1, header = T)
#standardize the variables
returns.pca <- prcomp(returns[2:ncol(returns)], scale = TRUE)

结果是:

  

svd(x,nu = 0)中的错误:'x'

中的无限或缺失值

这有很多问题,首先是你如何解决这个问题?其次,如何浏览我的数据以确保正确处理或替换缺失值?事实上我的数据是data.frame而不是导致问题的矩阵吗?

我不知道如何附加CSV文件,但这里是文件的前几行(有241行):

Date    Returns Var1    Var2    Var3    Var4    Var5    Var6    Var7    Var8    Var9    Var10   Var11   Var12   Var13   Var14   Var15   Var16   Var17   Var18   Var19   Var20   Var21   Var22   Var23   Var24   Var25   Var26   Var27   Var28   Var29   Var30   Var31   Var32   Var33   Var34   Var35   Var36   Var37   Var38   Var39   Var40   Var41   Var42   Var43   Var44   Var45   Var46   Var47   Var48   Var49   Var50   Var51   Var52   Var53   Var54   Var55   Var56   Var57   Var58   Var59   Var60   Var61
6/30/2014   0.48    18.12   9.44    107.43  19.53   1.92    11.54   0.99    3.33    98.83   0.44    2.59    3.42    105.15  308.59  80.44   1.36    0.94    102.07  1.69    331.47  53656.02    21897.39    11022.87    23144.90    15131.80    0.59    2.70    1.35    0.58    0.33    0.25    103.38  1.67    2.59    3.42    1.75    0.10    1.09    2.00    -0.11   1.24    2.08        0.22            138780.00                                                       
5/31/2014   1.52    17.63   9.44    107.18  14.36   1.96    12.48   1.01    3.49    98.60   0.37    2.55    3.39    101.79  306.79  79.96   1.37    0.93    101.84  1.68    324.69  53122.21    21159.31    10558.07    22584.93    14343.14    0.59    2.62    1.40    0.52    0.41    0.11    103.39  1.58    2.55    3.39    1.81    0.09    1.11    1.96    -0.07   1.15    2.29        0.47    3.50    1.49    138492.00   171.04  11302.80    4322654.00  55.40   -44.39  441.59  1000.70 117.44  11.60           6.50    1.50    0.50
4/30/2014   1.07    17.40   9.45    107.11  22.93   1.96    14.20   1.02    3.49    98.24   0.40    2.69    3.52    102.03  308.63  79.85   1.38    0.93    102.51  1.67    323.24  51470.08    21660.07    10399.85    22598.44    14475.33    0.61    2.67    1.53    0.53    0.47    0.06    103.47  1.69    2.69    3.52    1.82    0.09    1.49    2.08    0.02    1.16    2.04    -4.63   0.04    3.50    1.42    138268.00   171.58  11227.50    4296049.00  54.90   -47.04  425.02  204.90  117.57  11.60       27.30   6.60    1.80    1.40
3/31/2014   0.50    17.51   9.51    106.40  25.98   1.95    14.84   1.09    3.65    98.40   0.38    2.72    3.62    100.51  303.49  79.87   1.38    0.91    102.36  1.66    316.98  47046.98    20839.70    10097.38    21980.77    14694.83    0.61    2.72    1.59    0.52    0.48    0.04    103.44  1.63    2.72    3.62    1.99    0.08    1.73    2.10    0.00    1.13    2.02        0.91    3.30    1.20    137964.00   171.47  11169.00    4226971.00  53.70   -44.18  452.77  608.80  117.39  11.70   15.10   27.30   6.80    1.60    0.20
2/28/2014   1.76    17.10   9.52    106.27  25.35   1.96    15.47   1.13    3.88    98.46   0.31    2.70    3.66    100.68  294.91  80.44   1.37    0.90    102.12  1.66    315.92  47367.89    20039.38    10048.23    22188.31    14617.57    0.60    2.74    1.66    0.44    0.44    0.01    103.45  1.50    2.69    3.66    2.16    0.07    1.82    2.10    -0.05   1.04    1.87        0.91    3.10    1.08    137761.00   169.34  11133.50    4159972.00  53.20   -42.59  383.36  -48.40  116.28  11.70       27.30   6.90    1.70    1.70

2 个答案:

答案 0 :(得分:1)

看起来您的数据存在某些日期缺少值的问题,因此您必须进行一些数据清理。下面的代码是您如何为您提供的行执行此操作的示例。只有两个日期似乎是完整的,所以继续进行PCA分析并没有多大意义。

我已经将您输入的数据从上面加载到变量xx中。

 xx <- sub("\n"," ",xx)            #  delete \n in data
 xy <- unlist(strsplit(xx,split=" "))      #  change string to character vector
 start_of_new_date <- grep("[0-9]/[0-9]{2}/2014",xy)      # find start of new dates in data
 diff(start_of_new_date)                  # notice that the number of values between dates are not all 62 so some lines are missing values
 ar <- matrix(c(c("Date", xy[1:61]), xy[168:291]), nrow=3,byrow=TRUE )       # convert only complete dates, March and April, to matrix
 df <- data.frame(Date=ar[2:3,1], ar[2:3,2:62], stringsAsFactors=FALSE)      #   convert dates and data to data frame
 colnames(df) <- c("Date",ar[1,2:62])                          # make var strings column names in data frame
 df[,2:62] <- sapply(df[,2:62], as.numeric)                  # convert data columns from character to numeric
 dfs <- scale(df[,2:62])         # example only; running scale on two row data columns is meaningless since all will scale to same values

答案 1 :(得分:0)

Error in svd(x, nu = 0) : 0 extent dimensions

可能重复

在以下日志转换后可以替换负无穷大值。

// Then, define your class with it's annotated Fields
class MyClass {
   @MyAnnot(used = "Hey", type = "There")
   String fielda

   @MyAnnot(used = "denn", type = "Ton") 
   String fieldc
}

def findAllPropertiesForClassWithAnotation(obj, annotClass) {
   def op = []
   def annos = []
   def i = 0
   obj.properties.findAll { prop ->
      obj.getClass().declaredFields.find { 
         it.name == prop.key && annotClass in it.declaredAnnotations*.annotationType()
         annos=it.declaredAnnotations
         i++
         if(annos)
         op << annos[0] as Set
      // println"Props ${annos[0]}"
      }
   }
   op.each{ println "${it} and i is ${i}"}
}

// Then, define an instance of our class
MyClass a = new MyClass(fielda: 'tim', fieldc: 'dennisStar')

// And print the results of calling our method
println findAllPropertiesForClassWithAnotation(a, MyAnnot)