この質問は、この質問のより具体的で単純化されたバージョンです。
私が使用しているデータセットは、単一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))