Анализ хи-квадрат с использованием для цикла в R - PullRequest
7 голосов
/ 12 сентября 2011

Я пытаюсь выполнить анализ хи-квадрат для всех комбинаций переменных в данных, и мой код:

Data <- esoph[ , 1:3]
OldStatistic <- NA
for(i in 1:(ncol(Data)-1)){
for(j in (i+1):ncol(Data)){
Statistic <- data.frame("Row"=colnames(Data)[i], "Column"=colnames(Data)[j],
                     "Chi.Square"=round(chisq.test(Data[ ,i], Data[ ,j])$statistic, 3),
                     "df"=chisq.test(Data[ ,i], Data[ ,j])$parameter,
                     "p.value"=round(chisq.test(Data[ ,i], Data[ ,j])$p.value, 3),
                      row.names=NULL)
temp <- rbind(OldStatistic, Statistic)
OldStatistic <- Statistic
Statistic <- temp
}
}

str(Data)
'data.frame':   88 obs. of  3 variables:
 $ agegp: Ord.factor w/ 6 levels "25-34"<"35-44"<..: 1 1 1 1 1 1 1 1 1 1 ...
 $ alcgp: Ord.factor w/ 4 levels "0-39g/day"<"40-79"<..: 1 1 1 1 2 2 2 2 3 3 ...
 $ tobgp: Ord.factor w/ 4 levels "0-9g/day"<"10-19"<..: 1 2 3 4 1 2 3 4 1 2 ...


Statistic
    Row Column Chi.Square df p.value
1 agegp  tobgp      2.400 15       1
2 alcgp  tobgp      0.619  9       1

Мой код дает результаты анализа хи-квадрат для переменной 1 против переменной 3 и переменной 2 против переменной 3 и отсутствует для переменной 1 против переменной 2. Я старался, но не смог исправить код. Любые комментарии и предложения будут высоко оценены. Я хотел бы сделать кросс-табулирование для всех возможных комбинаций. Заранее спасибо.

EDIT

Раньше я делал такой анализ в SPSS, но теперь я хочу переключиться на R.

Ответы [ 2 ]

17 голосов
/ 12 сентября 2011

Хотелось бы получить образец ваших данных, но я думаю, что это сработает для вас.Сначала создайте комбинацию всех столбцов с combn.Затем напишите функцию для использования с функцией apply для итерации по комбинациям.Мне нравится использовать plyr, так как легко указать, что вы хотите для структуры данных на серверной части.Также обратите внимание, что вам нужно вычислять критерий хи-квадрат только один раз для каждой комбинации столбцов, что также должно немного ускорить процесс.

library(plyr)

combos <- combn(ncol(Dat),2)

adply(combos, 2, function(x) {
  test <- chisq.test(Dat[, x[1]], Dat[, x[2]])

  out <- data.frame("Row" = colnames(Dat)[x[1]]
                    , "Column" = colnames(Dat[x[2]])
                    , "Chi.Square" = round(test$statistic,3)
                    ,  "df"= test$parameter
                    ,  "p.value" = round(test$p.value, 3)
                    )
  return(out)

})  
0 голосов
/ 10 ноября 2016

Я написал свою собственную функцию.Он создает матрицу, в которой все номинальные переменные проверяются друг против друга.Он также может сохранить результаты в виде файла Excel.Он отображает все значения, которые меньше 5%.

funMassChi <- function (x,delFirst=0,xlsxpath=FALSE) {
  options(scipen = 999)

  start <- (delFirst+1)
  ds <- x[,start:ncol(x)]

  cATeND <- ncol(ds)
  catID  <- 1:cATeND

  resMat <- ds[1:cATeND,1:(cATeND-1)]
  resMat[,] <- NA

    for(nCc in 1:(length(catID)-1)){
      for(nDc in (nCc+1):length(catID)){
        tryCatch({
          chiRes <- chisq.test(ds[,catID[nCc]],ds[,catID[nDc]])
          resMat[nDc,nCc]<- chiRes[[3]]
        }, error=function(e){cat(paste("ERROR :","at",nCc,nDc, sep=" "),conditionMessage(e), "\n")})
      }
    }
  resMat[resMat > 0.05] <- "" 
  Ergebnis <- cbind(CatNames=names(ds),resMat)
  Ergebnis <<- Ergebnis[-1,] 

  if (!(xlsxpath==FALSE)) {
     write.xlsx(x = Ergebnis, file = paste(xlsxpath,"ALLChi-",Sys.Date(),".xlsx",sep=""),
             sheetName = "Tabelle1", row.names = FALSE)
  }
}

funMassChi(categorialDATA,delFirst=3,xlsxpath="C:/folder1/folder2/")

delFirst может удалить первые n столбцов.Так что если у вас есть счетчик или что-то, что вы не хотите тестировать.

Я надеюсь, что это может помочь кому-то еще.

...