This diagram seems to have the following logic: one starts with {1,2,3,4}
and finds all subsets of that list that emerge by dropping one entry, and puts them in the next line. In the line below that, one puts all subsets of these, which emerge by dropping another element. Continuing like this, one arrives at one-element lists in the last line.
A given list gets connected with a list on the upper level if it is fully contained in that list. One may wonder if one can make LaTeX decide where one should draw these connecting line. The answer is
yes
Of course, this requires some preparations, like a membership test, which is available e.g. here, and a function that finds the intersection of two list, which I added here. The result is
\documentclass[tikz,border=3mm]{standalone}
\newcounter{iloop}
\makeatletter
\pgfmathdeclarefunction{memberQ}{2}{%
\begingroup%
\edef\pgfutil@tmpb{0}%memberQ({\lstPast},\inow)
\edef\pgfutil@tmpa{#2}%
\expandafter\pgfmath@member@i#1\pgfmath@token@stop%
\edef\pgfmathresult{\pgfutil@tmpb}%
\pgfmath@smuggleone\pgfmathresult%
\endgroup}
\def\pgfmath@member@i#1{%
\ifx\pgfmath@token@stop#1%
\else
\edef\pgfutil@tmpc{#1}%
\ifx\pgfutil@tmpc\pgfutil@tmpa\relax%
\gdef\pgfutil@tmpb{1}%
\fi%
\expandafter\pgfmath@member@i%
\fi}
\pgfmathdeclarefunction{intersection}{2}{%
\begingroup%
\pgfmathparse{int(dim(#1)-1)}%
\pgfutil@tempcnta=\pgfmathresult%
\pgfutil@tempcntb=0%
\edef\pgfutil@tmpc{}%
\edef\pgfutil@tmpd{}%
\loop%
\pgfmathsetmacro{\pgfutil@tmpe}{{#1}[\the\pgfutil@tempcntb]}%
\pgfmathtruncatemacro{\pgfutil@tmpa}{memberQ("#2",\pgfutil@tmpe)}%
\ifnum\pgfutil@tmpa=1%
\ifx\pgfutil@tmpc\pgfutil@tmpd%
\edef\pgfutil@tmpc{\pgfutil@tmpe}%
\else%
\edef\pgfutil@tmpc{\pgfutil@tmpc,\pgfutil@tmpe}%
\fi%
\fi%
\advance\pgfutil@tempcntb1%
\ifnum\the\pgfutil@tempcntb<\the\pgfutil@tempcnta\repeat%
\edef\pgfmathresult{\pgfutil@tmpc}%
\pgfmathsmuggle\pgfmathresult%
\endgroup}
\makeatother
\begin{document}
\begin{tikzpicture}
\def\myn{0}
\foreach \X [count=\Y,remember=\X as \LastX,remember=\myn as \mylastn] in {{"1,2,3,4"},{"1,2,3","1,2,4","1,3,4","2,3,4"},%
{"1,2","1,3","1,4","2,3","2,4","3,4"},{"1","2","3","4"}}
{\pgfmathtruncatemacro{\myn}{dim({\X})-1}
\pgfmathsetmacro{\myfirst}{{\X}[0]}
\pgfmathsetmacro{\mylast}{{\X}[\myn]}
\ifnum\Y=1
\pgfmathsetmacro{\myfirst}{{{\X}}[0]}
\node (L-1-1) at (0,0) {$\{\myfirst\}$};
\else
\node (L-\Y-1) at (-4,1.5-\Y*1.5) {$\{\myfirst\}$};
\node (L-\Y-\the\numexpr\myn+1) at (4,1.5-\Y*1.5) {$\{\mylast\}$};
\path (L-\Y-1.center) -- (L-\Y-\the\numexpr\myn+1\relax.center)
foreach \Z in {1,...,\the\numexpr\myn-1}
{[/utils/exec=\pgfmathsetmacro{\myentry}{{\X}[\Z]}]
node[pos=\Z/\myn] (L-\Y-\the\numexpr\Z+1) {$\{\myentry\}$} };
\ifnum\Y=2
\foreach \Z in {0,...,\the\numexpr\myn}
{\draw (L-\Y-\the\numexpr\Z+1) -- (L-1-1);}
\else
\foreach \Z in {0,...,\the\numexpr\myn}
{\pgfmathsetmacro{\CurrentItem}{{\X}[\Z]}%
\setcounter{iloop}{0}%
\loop\pgfmathsetmacro{\LastItem}{{\LastX}[\value{iloop}]}%
\stepcounter{iloop}%
\pgfmathsetmacro{\myintersection}{intersection("\CurrentItem","\LastItem")}%
\pgfmathtruncatemacro{\nint}{dim(\myintersection)-dim(\CurrentItem)}%
\ifnum\nint=0
\draw (L-\Y-\the\numexpr\Z+1) --
(L-\the\numexpr\Y-1\relax-\the\numexpr\value{iloop});
\fi
\ifnum\value{iloop}<\the\numexpr\mylastn+1\relax%
\repeat
}
\fi
\fi
}
\draw[red,very thick] (L-1-1) -- (L-2-3) -- (L-3-3) -- (L-4-1);
\end{tikzpicture}
\end{document}

The only thing that is hard coded is the red line, for which I didn't see any pattern. However, drawing this is as simple as
\draw[red,very thick] (L-1-1) -- (L-2-3) -- (L-3-3) -- (L-4-1);
The advantage is that this is applicable to other similar diagrams, and one does not have to draw things by hand. (For instance, as of now, in the other answer the connection between {1,3,4}
and {1,3}
is missing. If I had to draw these by paws I would most likely miss more connections.)