lm()的有序因子水平过多

时间:2019-10-18 03:06:05

标签: r lm

我有一个数据框,其中包含year变量,跨越100年。该变量最初是一个整数,但我认为将其转换为有序因子是一个好主意。

> myDf <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = TRUE),
                   z = rnorm(96))

但是,当我尝试训练模型时,会产生错误。

> myFit <- lm(z ~ year, data = myDf)

Error in ctrfn(levels(x), contrasts = contrasts) : 
orthogonal polynomials cannot be represented accurately enough for 95 degrees of freedom

搜索后,我只能从contr.poly源代码中找到以下内容。

if (n > 95) 
  stop(gettextf("orthogonal polynomials cannot be represented accurately enough for %d degrees of freedom", 
                n - 1), domain = NA)

所以我然后尝试了以下方法:

> myDf2 <- data.frame(year = factor(1900:1994, levels = 1900:1994, ordered = TRUE),
                    z = rnorm(95))
> myFit2 <- lm(z ~ year, data = myDf2)

它不会返回错误。

因子排序的事实是否有所作为?

> myDf3 <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = FALSE),
                    z = rnorm(96))
> myFit3 <- lm(z ~ year, data = myDf3)

没有错误产生。显然,是导致此错误的顺序。

我不了解在95个自由度处截止的意义,也不了解contr.polylm的关系。还是根本没有关系?为什么订购很重要?

此外,订购一个因子的水平是否像我不明智的那样?我的思考过程是我应该将year从整数转换为有序因数,因为year不会像数据集中的其他变量(即距离)那样“缩放”。比例可能不是正确的术语,但我只是说年份变量在数据集中有矛盾,而距离却没有。

0 个答案:

没有答案