0

この質問は、この質問のより具体的で単純化されたバージョンです

私が使用しているデータセットは、単一lmまたはspeedlm計算には大きすぎます。
データセットをより小さな部分に分割したいのですが、これを行うと、1 つ (または複数) の列に 1 つのfactorしか含まれません。
以下のコードは、私の例を再現するための最低限のものです。質問の最後に、興味のある方のためにテスト スクリプトを記載します。

library(speedglm)

iris$Species <- factor(iris$Species)
i <- iris[1:20,]
summary(i)
speedlm(Sepal.Length ~ Sepal.Width + Species , i)

これにより、次のエラーが発生します。

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

因数分解を試みましiris$Speciesたが、成功しませんでした。どうすれば今これを修正できるのか、本当にわかりません。

Speciesモデルにどのように含めることができますか? (サンプルサイズを増やさずに)

編集:
「setosa」というレベルが 1 つしかないことはわかっていますが、次のスクリプト例に示すように、最終的にはより多くの要因でモデルを更新するため、線形モデルに含める必要があります。


興味のある方のために、実際のデータセットに使用するスクリプトの例を次に示します。

library(speedglm)

testfunction <- function(start.i, end.i) {
  return(iris[start.i:end.i,])
}

  lengthdata <- nrow(iris)
  stepsize <- 20

## attempt to factor
  iris$Species <- factor(iris$Species)

## Creates the iris dataset in split parts
  start.i <- seq(0, lengthdata, stepsize)
  end.i   <- pmin(start.i + stepsize, lengthdata)

  dat <- Map(testfunction, start.i + 1, end.i)

## Loops trough the split iris data
  for (i in dat) {
    if (!exists("lmfit")) {
      lmfit  <- speedlm(Sepal.Length ~ Sepal.Width + Species , i)
    } else if (!exists("lmfit2")) {
      lmfit2 <- updateWithMoreData(lmfit, i)
    } else {
      lmfit2 <- updateWithMoreData(lmfit2, i)
    }
  }
  print(summary(lmfit2))
4

1 に答える 1

1

より良い方法があるかもしれませんが、行を並べ替えると、各分割にはより多くのレベルが含まれるため、エラーは発生しません。私はランダムな順序で作成しましたが、より体系的な方法で作成したい場合があります。

library(speedglm)

testfunction <- function(start.i, end.i) {
    return(iris.r[start.i:end.i,])
}

lengthdata <- nrow(iris)
stepsize <- 20

## attempt to factor
iris$Species <- factor(iris$Species)

##Random order
set.seed(1)
iris.r <- iris[sample(nrow(iris)),]

## Creates the iris dataset in split parts
start.i <- seq(0, lengthdata, stepsize)
end.i   <- pmin(start.i + stepsize, lengthdata)

dat <- Map(testfunction, start.i + 1, end.i)

## Loops trough the split iris data
for (i in dat) {
    if (!exists("lmfit")) {
        lmfit  <- speedlm(Sepal.Length ~ Sepal.Width + Species , i)
    } else if (!exists("lmfit2")) {
        lmfit2 <- updateWithMoreData(lmfit, i)
    } else {
        lmfit2 <- updateWithMoreData(lmfit2, i)
    }
}
print(summary(lmfit2))

編集 ランダムな順序の代わりに、モジュロ除算を使用して、体系的な方法でスプレッドアウトインデックスベクトルを生成できます。

spred.i <- seq(1, by = 7, length.out = 150) %% 150 + 1
iris.r <- iris[spred.i,]
于 2015-10-15T10:27:50.353 に答える