我试图通过RPy分析用lme4.lmer()生成的一组线性模型的偏差。这里的笔记本展示了一个完整的示例,我导入了我的dep,加载了我的文件,运行了lme4.lmer(),并且没有让anova在它们上运行。
为了您的方便,这里再次是一个粘贴的线,正在失败,我想看到工作。
compare = stats.anova(res[0], res[1], res[2])
Error in Ops.data.frame(data, data[[1]]) :
list of length 3 not meaningful
In addition: Warning message:
In anova.merMod(<S4 object of class "lmerMod">, <S4 object of class "lmerMod">, :
failed to find unique model names, assigning generic names
---------------------------------------------------------------------------
RRuntimeError Traceback (most recent call last)
<ipython-input-47-fe0ffa3b55de> in <module>()
----> 1 compare = stats.anova(res[0], res[1], res[2])
/usr/lib64/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, args, **kwargs)
84 v = kwargs.pop(k)
85 kwargs[r_k] = v
---> 86 return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
/usr/lib64/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
33 for k, v in kwargs.iteritems():
34 new_kwargs[k] = conversion.py2ri(v)
---> 35 res = super(Function, self).__call__(*new_args, **new_kwargs)
36 res = conversion.ri2py(res)
37 return res
RRuntimeError: Error in Ops.data.frame(data, data[[1]]) :
list of length 3 not meaningful
这段代码在R中运行得非常完美,如下所示:
> mydata = read.csv("http://chymera.eu/data/test/r_data.csv")
> library(lme4)
Loading required package: lattice
Loading required package: Matrix
> lme1 = lme4.lmer(formula='RT~cat2 + (1|ID)', data=mydata, REML=FALSE)
Error: could not find function "lme4.lmer"
> lme1 = lmer(formula='RT~cat1 + (1|ID)', data=mydata, REML=FALSE)
> lme2 = lmer(formula='RT~cat2 + (1|ID)', data=mydata, REML=FALSE)
> anova(lme1,lme2)
> lme3 = lmer(formula='RT~cat2*cat1 + (1|ID)', data=mydata, REML=FALSE)
> stats::anova(lme1, lme2, lme3)
Data: mydata
Models:
lme1: RT ~ cat1 + (1 | ID)
lme2: RT ~ cat2 + (1 | ID)
lme3: RT ~ cat2 * cat1 + (1 | ID)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
lme1 4 116.68 122.29 -54.342 108.68
lme2 4 149.59 155.19 -70.793 141.59 0.000 0 1
lme3 6 117.19 125.59 -52.594 105.19 36.398 2 1.248e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
你能帮我让它在RPy上运行吗?
发布于 2013-11-12 17:45:30
在R中,stats::anova()
可能是从函数调用中未计算的表达式中推断模型名称的。这是lme1
,'lme2
和lme3
。
现在,考虑不使用变量名称而重写R代码,因为这更接近于当前实现中发生的情况,因为数据rpy2
和拟合的模型不绑定到变量名。这将给出以下内容(注意:“更近”而不是“平等”-关于这一点的细节只会分散注意力):
stats::anova(lmer(formula='RT~cat1 + (1|ID)',
data=read.csv("http://chymera.eu/data/test/r_data.csv"),
REML=FALSE),
lmer(formula='RT~cat2 + (1|ID)',
data=read.csv("http://chymera.eu/data/test/r_data.csv"),
REML=FALSE),
lmer(formula='RT~cat2*cat1 + (1|ID)',
data=read.csv("http://chymera.eu/data/test/r_data.csv"),
REML=FALSE))
结果是R.
Error in names(mods) <- sub("@env$", "", mNms) :
'names' attribute [6] must be the same length as the vector [3]
In addition: Warning message:
In anova.merMod(lmer(formula = "RT~cat1 + (1|ID)", data = read.csv("http://chymera.eu/data/test/r_data.csv"), :
failed to find unique model names, assigning generic names
这意味着R函数lme4:::anova.meMod
所做的假设很容易被违反,应该通知包的作者。
它还显示表达式将用于识别结果文本输出中的模型。
以下可能缺乏一些优雅,但应该是一个解决办法,并保持标签为模型短。
# bind the DataFrame to an R symbol
robjects.globalenv['dataf'] = dfr
# build models, letting R fetch the symbol `dataf` when it is evaluating
# the parameters in the function call
res = list()
for formula in formulae:
lme_res = lme4.lmer(formula=formula, data=base.as_symbol("dataf"), REML='false')
res.append(lme_res)
# This is enough to work around the problem
compare = stats.anova(res[0], res[1], res[2])
# if not happy with the model names displayed by `compare`,
# globalenv can be filled further
names = list()
for i, value in enumerate(res):
names.append('lme%i' % i)
robjects.globalenv[names[i]] = value
# call `anova`
compare = stats.anova(*[base.as_symbol(x) for x in names])
发布于 2013-11-13 11:32:44
这是用于anova
对象的merMod
方法中的一个bug :它本质上是由传递给R的对象的名称太长引起的,因此当deparse()
d结束时,它们是具有(意外)多个元素的字符向量。这是由https://github.com/lme4/lme4/commit/075c78d128db9d8398f43474621e49f32fdb5bd1修正的;现在还有一个(无文档的)参数model.names
,可以指定它来覆盖模型名称的离开。
您可以使用devtools::install_github("lme4","lme4")
安装开发版本,否则可能需要等待一段时间才能发布修补版本.除了构造您的调用之外,无法想到其他的解决方法,以便在离开时传递给R的语言对象更短。
https://stackoverflow.com/questions/19928662
复制