python - 从 2D 到 1D,如何在混合模型中传递第二个随机效应 [Python, Statsmodel]
问题描述
这个问题的构建:Q
假设我有一个这样的数据框:
import pandas as pd
d = {'y':[1.2,2.41,3.12,4.76],'x':['A','B'],'r1':['a','b','c','d'],'r2':['a2','b2','c2','d2']}
df = pd.DataFrame(d)
y 是一个连续变量。x 是分类的并且是固定分量。它是二进制的。r1, r2 是分类的。它们是随机分量。
我会将它传递给混合模型:
import statsmodels.formula.api as smf
md = smf.mixedlm("y ~ x", df, groups=df["r1"], re_formula="~ r1")
这很好用。
但是现在我想添加第二个随机变量,但这只能作为一维数组来完成......而且我不知道如何将我传递给的数据重新排列groups
为一维数组
综上所述:如何以这种方式重新排列数据框,以便我可以将 2 个变量groups
作为一维数组传递?请显示此语法。
解决方案
所以你需要crossed random effects models
.
从文档中:
Statsmodels MixedLM 处理大多数非交叉随机效应模型和一些交叉模型。为了在模型中包含交叉随机效应,有必要将整个数据集视为一个组。然后可以使用模型的方差分量参数来定义具有交叉和非交叉随机效应的各种组合的模型。
由于您需要一个没有独立组的交叉模型,因此您需要将每个人放在同一组中并使用方差分量指定随机效应。
import pandas as pd
import statsmodels.api as sm
d = {'y':[1,2,3,4],'x':[1,2,3,4],'r1':[1,2,3,4],'r2':[1,2,3,4]}
df = pd.DataFrame(d)
df["group"] = 1 # all in the case group
vcf = {"r1": "0 + C(r1)", "r2": "0 + C(r2)"} # formula
model = sm.MixedLM.from_formula("y ~ x", groups="group",
vc_formula=vcf, re_formula="~r1", data=df)
result = model.fit()
推荐阅读
- html - (s)html 文件的 .htaccess 重写规则,获取参数丢失
- functional-programming - 相互递归高阶
- pandas - 插值连续数
- c# - 将内部联接 Datagridview 导出到 Excel
- python - Mypy 错误:“重载的函数签名 2 永远不会匹配:签名 1 的参数类型相同或更宽”
- node.js - 在节点 js 中将 eval 选项设置为 true 时传递 workerData
- flutter - 我可以在下面的颤动代码中删除 const 吗?
- statistics - 使用 Fisher 精确检验、卡方检验测试独立性时的双边/单边特定目的
- sql - 如何在 SQL Server 中形成自定义 Json 对象
- c# - 我可以对已经定义了项目源的 DataGrid 中的复选框使用不同的项目源吗?